当它的 shared_ptr 被摧毁时 weak_ptr 会发生什么?

What Happens to a weak_ptr when Its shared_ptr is Destroyed?

它引用的一个weak_ptr somehow just knows when the shared_ptr似乎已经被销毁了。那个怎么样?是否有一个常量 link 保持不变?

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> 正确地将内存标识为已释放。它是怎么知道的?

一个std::shared_ptr是用两块内存创建的:

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

  • A control block:它包含特定于 shared_ptr 的信息,例如引用计数。

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

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

所以 weak_ptr 会知道它已经过期,因为它可以访问这个控制块,并且它可以检查 shared_ptr

的引用计数是多少