分配取消引用的shared_ptr

Assigning a dereferenced shared_ptr

本文关键字:ptr shared 取消 引用 分配      更新时间:2023-10-16

考虑以下类:

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

请帮助我理解:

  1. 为什么有两个MyClass(2)对象(对析构函数日志所做的假设)
  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();

这样做是为了更清楚地了解创造破坏:

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)