我写了以下简单代码,
#include <iostream>
#include <memory>
struct Foo
{
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
void bar() { std::cout << "Foo::bar\n"; }
};
int main()
{
std::shared_ptr<Foo> p1(new Foo);//this line
p1->bar();
std::shared_ptr<Foo> p2(p1);
}
在观察窗口我得到了,
p2 std::__1::shared_ptr<Foo> ptr = 0x100104350 strong=2 weak=1
p1 std::__1::shared_ptr<Foo> ptr = 0x100104350 strong=2 weak=1
现在,我可以理解strong = 2,但为什么弱= 1?
其次,在代码中我将代码更改为
std::shared_ptr<Foo> p1(std::move(new Foo));
因为,可能是一个弱指针是因为无名对象。所以我在创建p1时移动了它,但我仍然在观察窗口中获得相同的输出。
请说明我错过了哪一点?
答案 0 :(得分:8)
weak
显示的值不是存在的weak_ptr
个对象的数量,而是“弱计数”。
典型的shared_ptr
实现(源自Boost)在控制块中存储两个计数,一个强计数S
,即活动shared_ptr
个对象的数量和弱计数,W
,这是有效weak_ptr
个对象的数量+ (S != 0)
因此,如果有任何shared_ptr
个对象,则W将始终为非零。
原因是实现在S == 0
时销毁拥有的对象并在W == 0
由于您不希望在shared_ptr
个对象使用它时销毁控制块,因此W
在有活跃的shared_ptr
个对象时不得达到0。