如果我使用=运算符为它指定一个新的指针,前一个指针是否会自动在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?
答案 0 :(得分:4)
是的,否则你会有泄漏,这会破坏拥有智能资产的目的。
刚做了一个快速测试,我没有得到任何泄漏
#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个测试用例...
* 未检测到错误按任意键继续。
。
答案 1 :(得分: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