通过循环引用了解Shared_ptr?

时间:2017-06-13 00:35:36

标签: c++ c++11 shared-ptr cyclic-reference

我想了解shared_ptr增加或减少引用计数的方式吗?

 #include <iostream>
 #include <memory>

class B;

class A
{
  public:
  std::shared_ptr<B> b_ptr_;
};

class B
{
  public: 
  std::shared_ptr<A> a_ptr_;
};

void func(std::shared_ptr<A> &aptr)
{
  std::shared_ptr<B> bptr = std::make_shared<B>(); //Creating shared pointer
  bptr->a_ptr_ = aptr; // Creating cyclic dependency 
  aptr->b_ptr_ = bptr;

  std::cout<<"\nFunc::a_ptr_ use_count = "<<bptr->a_ptr_.use_count();
  std::cout<<"\nFunc::b_ptr_ use_count = "<<aptr->b_ptr_.use_count();     
}

int main()
{
  std::shared_ptr<A> aptr = std::make_shared<A>();
  std::cout<<"\nBefore func::a_ptr_ use_count = "<<aptr.use_count();
  func(aptr);
  std::cout<<"\nAfter func::a_ptr_ use_count = "<<aptr.use_count();
  std::cout<<"\nAfter func::b_ptr_ use_count = "<<aptr->b_ptr_.use_count();
  return 0;   
}

Output: 
This is the output I see:
Before func::a_ptr_ use_count = 1
Func::a_ptr_ use_count = 2
Func::b_ptr_ use_count = 2
After func::a_ptr_ use_count = 2
After func::b_ptr_ use_count = 1

但是我期待这个“在func :: a_ptr_ use_count = 1之后”。在bptr超出func()范围后,引用计数应该递减。 我在这里缺少什么?

提到的重复问题没有解释引用计数如何递增/递减。我对如何完成这项工作的内部机制更感兴趣(在shared_ptr中),这在另一个问题的答案中没有解释。

1 个答案:

答案 0 :(得分:0)

为什么引用计数会减少? bptr可能超出范围,但bptr仅影响B对象的引用计数。您的A对象仍有两个引用:

  1. 共享指针仍位于main
  2. 的范围内
  3. 存储在B对象
  4. 中的共享指针

    只要存在对A对象的实时引用,您的B对象将继续存在,反之亦然(这是您通过创建循环共享引用而故意触发的对象)。为了使B对象消失,您需要在引用周期中使用一个引用为弱/原始,并清除存储在main方法中的指针,以便不存在顶级引用。