为什么用shared_ptr创建弱指针?

时间:2014-08-28 12:57:02

标签: c++ pointers c++11 shared-ptr move

我写了以下简单代码,

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

请说明我错过了哪一点?

1 个答案:

答案 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。