为什么用shared_ptr创建弱指针?

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的同时移动了它,我仍然在观察窗口中获得相同的输出.

请告知我缺少哪一点?

Jon*_*ely 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 .