似乎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>
的状态但我没想到时会出现段错误。 weak_ptr<int>
正确地将内存标识为已释放。怎么知道?
答案 0 :(得分:13)
使用两段内存创建std::shared_ptr
:
资源块:它保存指向实际基础数据的指针,例如: &#39; INT *&#39;
控制块:它包含特定于shared_ptr的信息,例如引用计数。
(有时将这些内容分配到一块内存中以提高效率,请参阅std::make_shared
)
控制区块 还存储weak_ptr
的引用计数。在最后一个weak_ptr
超出范围(弱指针引用计数降至零)之前,它不会被释放。
因此,weak_ptr
会知道它已过期,因为它可以访问此控制块,并且可以检查shared_ptr
的引用计数是什么