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

Jon*_*Mee 11 c++ shared-ptr weak-ptr

似乎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;
}
Run Code Online (Sandbox Code Playgroud)

当我weak_ptr<int>去检查状态shared_ptr<int>但是没有一个时,我本来期望一个段错误.在weak_ptr<int>正确地识别存储器中作为释放.怎么知道的?

And*_*dyG 13

std::shared_ptr使用两个内存创建A :

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

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

(有时这些是为了提高效率而分配在一块内存中,请参阅std::make_shared)

控制模块 存储引用计数weak_ptr.直到最后一个weak_ptr超出范围(弱指针引用计数降为零)才会释放它.

所以a weak_ptr会知道它已经过期,因为它可以访问这个控制块,并且它可以检查以查看引用计数是什么shared_ptr

  • @JonathanMee:是的,从概念上讲,这就是正在发生的事情.顺便说一句,您可以打开标准库头文件并自己查看实现! (2认同)