1

如果我使用 = 运算符为其分配一个新指针,前一个指针是否会在 std::shared_ptr 中自动销毁(或取消引用)?

例如:

std::shared_ptr< Type > sp1 (ptr1, std::ptr_fun(destroy));
std::shared_ptr< Type > sp2 (ptr2);

sp1 = sp2; // now, will ptr1 be dereferenced and / or destroyed?
// and will the destroy() function get called?
4

2 回答 2

4

是的,否则你会有泄漏,它会破坏拥有智能 ptr 的目的。

刚刚做了一个快速测试,我没有发现任何泄漏

#define BOOST_TEST_MODULE leakTest
#include <boost/test/unit_test.hpp>


BOOST_AUTO_TEST_CASE( Leak_Test )
{
    std::shared_ptr< int > sp1 (new int(3));
    std::shared_ptr< int > sp2 (new int(4));

    sp1 = sp2;
}

结果:

运行 1 个测试用例...

*未检测到错误 按任意键继续。

. .

于 2012-07-30T04:06:57.487 回答
2

是的,它确实。shared_ptr 是一个数据结构,它有一个内部对象,它实际上保留了原始指针。这个内部对象有一个计数器,每次我们复制 shared_ptr 时递增,而当 shared_ptr 被销毁或分配另一个 shared_ptr 时递减。一旦计数下降到零,内部对象就会与原始指针一起被销毁。

在你的情况下:

std::shared_ptr< Type > sp1 (ptr1, std::ptr_fun(destroy)); //the counter of sp1 is 1
std::shared_ptr< Type > sp2 (ptr2); //the counter of sp2 is 1
sp1 = sp2; //the counter of sp1 is 0, the counter of sp2 is 2

因此,ptr1 将被销毁,sp1 和 sp2 将共享相同的指针 ptr2

于 2012-07-30T04:23:50.933 回答