C++ 弱\u ptr,使\u共享和内存释放

C++ 弱\u ptr,使\u共享和内存释放,c++,c++11,shared-ptr,weak-ptr,make-shared,C++,C++11,Shared Ptr,Weak Ptr,Make Shared,当至少存在一个弱\u ptr时,共享\u ptr的控制块保持活动状态。如果共享指针是使用make_shared创建的,则表示对象的整个内存都保持分配状态。(对象本身已正确销毁,但由于控制块和对象的内存分配在一个块中,正如make_shared所做的那样,它们只能一起释放。) 我的理解正确吗 这种行为似乎代表了一个问题,例如在著名的。对象的内存将永远保持分配状态 这在任何实际情况下都是一个问题吗?在这种情况下(大型对象和意图使用弱ptrs),是否应使用构造函数创建共享ptr 我的理解正确吗 对。如

当至少存在一个
弱\u ptr
时,
共享\u ptr
的控制块保持活动状态。如果共享指针是使用
make_shared
创建的,则表示对象的整个内存都保持分配状态。(对象本身已正确销毁,但由于控制块和对象的内存分配在一个块中,正如
make_shared
所做的那样,它们只能一起释放。)

我的理解正确吗

这种行为似乎代表了一个问题,例如在著名的。对象的内存将永远保持分配状态

这在任何实际情况下都是一个问题吗?在这种情况下(大型对象和意图使用
弱ptr
s),是否应使用构造函数创建
共享ptr

我的理解正确吗

对。如果您的
弱\u ptr
s明显比(大)对象寿命长,并且内存紧张,则避免
使\u共享可能是有益的


然而,这里的“大”是通过
sizeof
来衡量的,许多概念上的“大”对象(例如,除
std::array
之外的大多数标准容器)按照该指标都非常小,因为它们分配了额外的内存来存储其内容,一旦对象被销毁,它就会被释放。

我在VS2013中尝试过这个,你完全正确。销毁最后一个共享的\u ptr时会调用析构函数,因此与该对象关联的任何其他对象或内存都将被销毁,但如果使用make\u shared创建共享的\u ptr,则在最后一个弱的\u ptr被销毁之前,内存永远不会被销毁


如果lock()失败,我认为清理或重置你的弱ptr总是好的,因为即使没有make\u shared,它仍然使用一些内存。

是的,但请记住许多“大”对象将动态分配自己的内存,例如由
std::vector
组成的对象,这样,当对象被销毁时,动态分配的内存将被释放。您只需要担心对象本身的大小是否很大,例如一个大的
std::array
。如果您担心异常安全,您可以使用
make_unique
,然后从
unique_ptr
构建一个
shared_ptr
:例如
std::shared_ptr=std::make_unique()“清理或重置(…)总是好的。”是的,但没有任何东西阻止实现自动执行