其他分享
首页 > 其他分享> > c – 分配解除引用的shared_ptr

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