我想了解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”将是正确的结果。请给我答案。
答案 0 :(得分:4)
b
在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