Pra*_*ari 4 c++ pointers move shared-ptr c++11
我写了以下简单的代码,
#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);
}
Run Code Online (Sandbox Code Playgroud)
在观察窗口,我得到了,
p2 std::__1::shared_ptr<Foo> ptr = 0x100104350 strong=2 weak=1
p1 std::__1::shared_ptr<Foo> ptr = 0x100104350 strong=2 weak=1
Run Code Online (Sandbox Code Playgroud)
现在,我可以理解strong = 2,但为什么弱= 1?
其次,在代码中我将代码更改为,
std::shared_ptr<Foo> p1(std::move(new Foo));
Run Code Online (Sandbox Code Playgroud)
因为,可能是一个弱指针是因为无名对象.所以我在创建p1的同时移动了它,我仍然在观察窗口中获得相同的输出.
请告知我缺少哪一点?
显示的值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 .