为什么shared_ptr和weak_ptr这样工作? (用于解析循环引用)

时间:2015-11-24 12:49:58

标签: c++ shared-ptr weak-ptr

我想了解shared_ptr。经过研究,我知道weak_ptr可以解决shared_ptr中的循环引用问题,并且我编写了一些代码来测试它。

代码

class B;

class A
{
public:
    std::shared_ptr<B> _b;
    ~A() 
    {
        std::cout << "A dtor: " << _b.use_count() << std::endl; 
    }
};

class B
{
public:
    std::weak_ptr<A> _a;
    ~B() { std::cout << "B dtor: " << _a.use_count() << std::endl; }
};

int main()
{
    {
        std::shared_ptr<A> a(new A);
        std::shared_ptr<B> b(new B);

        std::cout << "a ref count: " << a.use_count() << std::endl;
        std::cout << "b ref count: " << b.use_count() << std::endl;

        a->_b = b;
        b->_a = a;

        std::cout << "a ref count: " << a.use_count() << std::endl;
        std::cout << "b ref count: " << b.use_count() << std::endl;
    }

    std::cin.get();

    return 0;
}

输出

a ref count: 1
b ref count: 1
a ref count: 1
b ref count: 2
A dtor: 1
B dtor: 0

我不知道为什么这段代码会像这样工作。我认为“A dtor:2”和“B dtor:0”将是正确的结果。请给我答案。

1 个答案:

答案 0 :(得分:4)

ba之前被破坏(因为此处的破坏以相反的构造顺序发生),这使得它的use_count减少了1。

  • 构建a - a use_count = 1
  • 构造b - b use_count = 1

  • 将b分配给A :: b_成员 - b use_count = 2

  • 分配给B :: a_成员 - 一个use_count = 1

  • 破坏b - b use_count = 1

  • 破坏a打印1作为b的use_count