我正在阅读有关共享指针的内容,这本书说让多个共享指针指向同一个内存是个坏主意,因为如果一个shared_ptr引用计数减少为0,它将取消分配该内存,从而使另一个shared_ptr指向垃圾。
int *z = new int;
shared_ptr<int> bad1(z);
shared_ptr<int> bad2(z);
但是,当z的引用计数变为0时,shared_ptr都不都知道吗?
答案 0 :(得分:7)
那不会造成泄漏。实际上,情况要糟得多,因为您有两个指向同一内存的 不相关 共享指针。这意味着双方都将认为自己拥有该内存的所有权,并且将各自尝试释放内存。
如果要使两个共享内存对象指向同一内存,请使用std::shared_ptr
初始化(或分配):
shared_ptr<int> good1(new int);
shared_ptr<int> good2 = good1;
答案 1 :(得分:2)
在您的示例中,您创建了两个单独的共享指针对象,每个共享对象都保存着指针z,并且每个对象都有自己的计数。因此,bad1和bad2的计数均为1。这两个共享的指针对象“彼此了解”,因为它们是分别构造的。
但是,如果您要执行以下操作:
int *z = new int;
shared_ptr<int> bad1(z);
shared_ptr<int> bad2 = bad1;
然后,您最终调用复制构造函数来构造bad2,并且两个共享指针都持有相同的计数器,这样当一个指针超出范围时,它会递减另一个共享指针看到的计数器。