请参阅下面的代码.. 最后一个cout将p1的use_count打印为2,这很好,因为p2存储了p1。为什么最后一行中的use_count也打印2?它应该不是1,因为p2是一个只存储p1的共享指针吗?
boost::shared_ptr<int> p1{new int{1}};
std::cout << *p1 << '\n';
std::cout << "--> " << p1.use_count() << "\n";
boost::shared_ptr<int> p2{p1};
std::cout << "--> " << p1.use_count() << " : " << p2.use_count() << "\n";
答案 0 :(得分:2)
use_count(和托管指针)在关联的shared_ptr
之间是共享。这使得最后shared_ptr
可以在托管指针被破坏时销毁它。
请注意,上一个shared_ptr
可能是p1
或p2
。根据您的理解p1
可能会在被管理对象被破坏时被误删除,甚至p2
仍然拥有该对象。
答案 1 :(得分:1)
它们是相同的,因为您使用复制构造函数从p2
构造p1
。 Boost docs如果p1
不是空shared_ptr
,则p2
将与p1
共享所有权。因此,您有两个shared_ptr
个实例p1
和p2
使用一个int
指针。
我认为您希望p1
和p2
指向不同的类型。如果您使用use_count()
boost::shared_ptr<boost::shared_ptr<int>> p2{p1};
为1
答案 2 :(得分:0)
它不应该是1,因为p2是一个只存储p1的共享指针吗?
没有。 此是仅存储p1:
的shared_ptrboost::shared_ptr<boost::shared_ptr<int> > p2{new boost::shared_ptr<int>{p1}};
<强> Live On Coliru 强>
换句话说,您发现共享指针共享引用计数。这就是整个目的。