当它的 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 保持不变?
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
的引用计数是多少
它引用的一个weak_ptr
somehow just knows when the shared_ptr
似乎已经被销毁了。那个怎么样?是否有一个常量 link 保持不变?
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