C++ 为什么指向同一内存的多个共享指针会导致内存泄漏?

C++ 为什么指向同一内存的多个共享指针会导致内存泄漏?,c++,C++,我正在读关于共享指针的书,书中说让多个共享指针指向同一内存是个坏主意,因为如果一个共享指针引用计数减少到0,它将释放该内存,使另一个共享指针指向垃圾 int *z = new int; shared_ptr<int> bad1(z); shared_ptr<int> bad2(z); int*z=新的int; 共享的ptr bad1(z); 共享的ptr bad2(z); 但是,当z的引用计数变为0时,共享\u ptr是否都知道这一点?这不会导致泄漏。实际上情况更糟

我正在读关于共享指针的书,书中说让多个共享指针指向同一内存是个坏主意,因为如果一个共享指针引用计数减少到0,它将释放该内存,使另一个共享指针指向垃圾

int *z = new int;
shared_ptr<int> bad1(z); 
shared_ptr<int> bad2(z);
int*z=新的int;
共享的ptr bad1(z);
共享的ptr bad2(z);

但是,当z的引用计数变为0时,共享\u ptr是否都知道这一点?

这不会导致泄漏。实际上情况更糟,因为有两个不相关的共享指针指向同一内存。这意味着双方都会认为自己拥有记忆的所有权,并且各自会尝试自己释放它

如果希望两个共享内存对象指向同一内存,请使用
std::shared\u ptr
初始化(或分配):

shared_ptr good1(新整数);
共享\u ptr good2=good1;

在您的示例中,您创建了两个单独的共享指针对象,每个对象都持有指针z,每个对象都有自己的计数。因此,bad1和bad2的计数都是1。这两个共享指针对象“彼此不了解”,因为它们是单独构造的

然而,如果你要做这样的事情:

int *z = new int;
shared_ptr<int> bad1(z); 
shared_ptr<int> bad2 = bad1;
int*z=新的int;
共享的ptr bad1(z);
共享_ptr bad2=bad1;

然后调用复制构造函数来构造bad2,两个共享指针都持有相同的计数器,这样,当一个指针超出范围时,它会减少另一个共享指针看到的计数器。

您的书是正确的。
bad1
bad2
如何“相互了解”?(它们确实存在,或者更准确地说,它们都共享相同的引用计数,在您复制构造函数副本并分配一个
共享的\u ptr
,如
共享的\u ptr bad2=bad1;
)的情况下,这有点像卖两次东西——在你卖了一次东西之后,就不再由你来卖了,这正是您尝试使用的
bad2
。看起来像是双重删除,而不是内存泄漏。好吧,也许“很好”。与所有共享指针/所有权的使用一样,它增加了泄漏的风险。即使是mark and sweep语言支持也会导致“泄漏”,因为过时的未使用对象附带了一些在应用程序结束之前永远不会被跟踪的引用。@一些程序员伙计等待,如果good2不复制good1,那么您仍然会得到两份共享的\u ptr?@ManhNguyen否,共享指针就是这样做的:它们共享指向同一内存区域的指针。
int *z = new int;
shared_ptr<int> bad1(z); 
shared_ptr<int> bad2 = bad1;