C++ 分配取消引用的共享\u ptr
考虑以下类别:C++ 分配取消引用的共享\u ptr,c++,memory-leaks,shared-ptr,dereference,C++,Memory Leaks,Shared Ptr,Dereference,考虑以下类别: struct MyClass { int mId; MyClass(int id): mId(id) {} ~MyClass() { std::cout << "deleting: " << mId << std::endl; } }; 请帮助我理解: 为什么有两个MyClass(2)对象(假设在析构函数日志上) 这是内存泄漏吗?MyClass(0)是否应该泄漏 谢谢。没有内存泄漏。此代码: m = MyClass(2)
struct MyClass {
int mId;
MyClass(int id): mId(id) {}
~MyClass() { std::cout << "deleting: " << mId << std::endl; }
};
请帮助我理解:
MyClass(2)
对象(假设在析构函数日志上)MyClass(0)
是否应该泄漏李>
谢谢。没有内存泄漏。此代码:
m = MyClass(2);
创建类型为MyClass
的临时对象,该对象使用MyClass
的复制赋值操作符(默认生成)复制到m
,然后销毁。最后,p
超出范围,其析构函数将销毁is指向的MyClass
实例(绑定到m
)
如果我们明确说明所有隐式调用,就会发生这种情况:
// std::shared_ptr<MyClass> p(new MyClass(0));
tmp1.MyClass(0);
p.shared_ptr(&tmp1);
// MyClass& m = *p;
p.operator* ();
// m = MyClass(2);
tmp2.MyClass(2);
m.operator= (tmp2);
tmp2.~MyClass();
// p goes out of scope
p.~shared_ptr();
tmp1.~MyClass();
//std::shared_ptr p(新的MyClass(0));
tmp1.MyClass(0);
p、 共享ptr(&tmp1);
//MyClass&m=*p;
p、 操作员*();
//m=MyClass(2);
tmp2.MyClass(2);
m、 运算符=(tmp2);
tmp2.~MyClass();
//p超出范围
p、 ~shared_ptr();
tmp1.~MyClass();
这样做可以更清楚地了解创建和销毁:
struct MyClass {
int mId;
MyClass(int id): mId(id) {std::cout << "Creating: " << this << "(" << mId << ")\n";}
~MyClass() {std::cout << "Deleting: " << this << "(" << mId << ")\n";}
MyClass(MyClass const& c)
{std::cout << "Copy: " << this << "(" << mId << ")\n"
" From: " << &c << "(" << c.mId << ")\n";
mId=c.mId;
}
MyClass& operator=(MyClass const& c)
{std::cout << "Assign: " << this << "(" << mId << ")\n"
" From: " << &c << "(" << c.mId << ")\n";
mId=c.mId;
}
};
非常感谢你的详尽回答,安杰!在“构造器/复制构造器/赋值/析构函数”中放上指纹,你就能更清楚地看到创建和销毁@你让我感到很尴尬:)
// std::shared_ptr<MyClass> p(new MyClass(0));
tmp1.MyClass(0);
p.shared_ptr(&tmp1);
// MyClass& m = *p;
p.operator* ();
// m = MyClass(2);
tmp2.MyClass(2);
m.operator= (tmp2);
tmp2.~MyClass();
// p goes out of scope
p.~shared_ptr();
tmp1.~MyClass();
struct MyClass {
int mId;
MyClass(int id): mId(id) {std::cout << "Creating: " << this << "(" << mId << ")\n";}
~MyClass() {std::cout << "Deleting: " << this << "(" << mId << ")\n";}
MyClass(MyClass const& c)
{std::cout << "Copy: " << this << "(" << mId << ")\n"
" From: " << &c << "(" << c.mId << ")\n";
mId=c.mId;
}
MyClass& operator=(MyClass const& c)
{std::cout << "Assign: " << this << "(" << mId << ")\n"
" From: " << &c << "(" << c.mId << ")\n";
mId=c.mId;
}
};
Creating: 0x7fc741c000e0(0)
Creating: 0x7fff50ac38c0(2)
Assign: 0x7fc741c000e0(0)
From: 0x7fff50ac38c0(2)
Deleting: 0x7fff50ac38c0(2)
Deleting: 0x7fc741c000e0(2)