当weak_ptr的shared_ptr被破坏时,它会发生什么

What Happens to a weak_ptr when Its shared_ptr is Destroyed?

本文关键字:ptr 什么 weak shared      更新时间:2023-10-16

似乎weak_ptr只知道它引用的shared_ptr何时被破坏。怎么了?是否保持了恒定的链接?

以以下代码为例:

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>的状态时,我本以为会出现segfault,但没有。weak_ptr<int>正确地将内存标识为已解除分配。它是怎么知道的?

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

  • 资源块:它保存指向实际底层数据的指针,例如"int*"

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

(为了提高效率,有时将这些内存分配在单个内存块中,请参阅std::make_shared

控制块 存储weak_ptr的参考计数。直到最后一个weak_ptr超出作用域(弱指针引用计数降至零),它才会被解除分配。

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