当weak_ptr的shared_ptr被破坏时,它会发生什么
What Happens to a weak_ptr when Its shared_ptr is Destroyed?
似乎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
的引用计数
相关文章:
- 对于没有功能的结构,"new (ptr) mystruct;"做什么?
- "[ptr, ptr+len) must be a valid range"是什么意思?
- 这个陈述'p = I.ptr<uchar>(i);有什么作用?
- 这是什么意思 *ptr = len
- 删除PTR C 后会发生什么
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- 这个声明"int(*ptr[3])();"是什么意思?
- (PTR + n-1) & -n 这个表达式有什么作用?
- (ptr + i)->Func() 和 &ptr[i] 之间有什么区别吗?Func()
- 如果您使一个char*ptr存储整数变量的地址,会发生什么
- 当使用运算符 new 更改为其他内存的指向已分配内存的 ptr 时会发生什么
- *ptr 和 * ptr 有什么区别
- (ptr语言 - A[0]) / (sizeof(A[0]) / sizeof(A[0][0]))的类型是什么?< /
- 这个语句表示什么[func ptr]
- 使用auto_ptr时,*ptr 和 *ptr.get() 有什么区别
- 在链表中设置head等于Node* ptr意味着什么?
- "(void)!ptr"做什么?
- 'Bad Ptr'在视觉C++中是什么意思?
- 这"int logprintf( const char* ptr, ... )"做什么?