当其shared_ptr被销毁时,weak_ptr会发生什么?

时间:2015-12-02 16:01:17

标签: c++ shared-ptr weak-ptr

似乎weak_ptr只知道它引用的shared_ptr何时被销毁。那个怎么样?是否存在持续的链接或什么?

选择following code for example

weak_ptr<int> test() {
    shared_ptr<int> foo{new int};

    return foo;
}

int main() {
    auto foo = test();

    cout << foo.expired() << endl;
}

weak_ptr<int>去检查shared_ptr<int>的状态但我没想到时会出现段错误。 weak_ptr<int>正确地将内存标识为已释放。怎么知道?

1 个答案:

答案 0 :(得分:13)

使用两段内存创建std::shared_ptr

  • 资源块:它保存指向实际基础数据的指针,例如: &#39; INT *&#39;

  • 控制块:它包含特定于shared_ptr的信息,例如引用计数。

(有时将这些内容分配到一块内存中以提高效率,请参阅std::make_shared

控制区块 存储weak_ptr的引用计数。在最后一个weak_ptr超出范围(弱指针引用计数降至零)之前,它不会被释放。

因此,weak_ptr会知道它已过期,因为它可以访问此控制块,并且可以检查shared_ptr的引用计数是什么