繁体   English   中英

在std :: shared_ptr中使用=运算符时,先前的指针是否被销毁?

[英]Is previous pointer destroyed when using = operator in std::shared_ptr?

如果我使用=运算符为其分配了新指针,则前一个指针是否会在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?

是的,否则您将发生泄密,这将使实现智能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个测试用例...

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

是的,它确实。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM