c – 分配解除引用的shared_ptr
作者:互联网
考虑以下课程:
struct MyClass {
int mId;
MyClass(int id): mId(id) {}
~MyClass() { std::cout << "deleting: " << mId << std::endl; }
};
用法:
std::shared_ptr<MyClass> p(new MyClass(0));
MyClass& m = *p;
m = MyClass(2);
结果是:
deleting: 2
deleting: 2
请帮我理解:
>为什么有两个MyClass(2)对象(假设在析构函数日志上)
>这是内存泄漏吗? MyClass(0)不应泄漏吗?
谢谢.
解决方法:
没有内存泄漏.这段代码:
m = MyClass(2);
创建一个MyClass类型的临时对象,使用MyClass的(默认生成的)复制赋值运算符将其复制到m中,然后进行破坏.最终,p超出了作用域,它的析构函数会破坏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();
标签:dereference,c,shared-ptr,memory-leaks 来源: https://codeday.me/bug/20190825/1719563.html