c++ - 为什么 shared_ptr 和 weak_ptr 会这样工作? (用于解决循环引用)

标签 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”将是正确的结果。请给我答案。

最佳答案

ba 之前被破坏(因为这里的破坏发生在构造的相反顺序),这将它的 use_count 减 1。

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

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

  • 将 a 分配给 B::a_ 成员 - a use_count = 1

  • 销毁 b - b use_count = 1

  • 销毁打印 1 作为 b 的 use_count 的 a

关于c++ - 为什么 shared_ptr 和 weak_ptr 会这样工作? (用于解决循环引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33894162/

相关文章:

c++ - 使用QScriptEngine的问题:必须在QScriptEngine之前构造一个Q(Core)Application

c++ - 在 MPI_Init() 之前初始化变量,在 MPI_Finanlize() 之后初始化变量

c++ - 名称 `weak_ptr::lock()` 的原因是什么?

c++ - 我应该如何在工厂类中存储弱指针列表?

c++ - 数组中的唯一整数

c++ - Gtkmm : How to update UI from another thread? 连续

C++0x 错误:将带有 std::shared_ptr 的函数重载为 const 参数不明确

c++: std::tr1::shared_ptr 从这个

c++ - shared_ptr : "is not a type" error

c++ weak_ptr在取消引用后过期?