boost :: shared_ptr中的ref_count

时间:2017-10-04 03:42:10

标签: c++ boost

请参阅下面的代码.. 最后一个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";

3 个答案:

答案 0 :(得分:2)

use_count(和托管指针)在关联的shared_ptr之间是共享。这使得最后shared_ptr可以在托管指针被破坏时销毁它。

请注意,上一个shared_ptr可能是p1p2。根据您的理解p1可能会在被管理对象被破坏时被误删除,甚至p2仍然拥有该对象。

答案 1 :(得分:1)

它们是相同的,因为您使用复制构造函数从p2构造p1Boost docs如果p1不是空shared_ptr,则p2将与p1共享所有权。因此,您有两个shared_ptr个实例p1p2 使用一个int指针。

我认为您希望p1p2指向不同的类型。如果您使用use_count()

,则每个boost::shared_ptr<boost::shared_ptr<int>> p2{p1};为1

答案 2 :(得分:0)

  

它不应该是1,因为p2是一个只存储p1的共享指针吗?

没有。 是仅存储p1:

的shared_ptr
boost::shared_ptr<boost::shared_ptr<int> > p2{new boost::shared_ptr<int>{p1}};

<强> Live On Coliru

换句话说,您发现共享指针共享引用计数。这就是整个目的。