weak_ptr,make_shared和内存释放

时间:2015-08-20 08:45:37

标签: c++ c++11 shared-ptr weak-ptr make-shared

shared_ptr的控制块保持活动状态,同时存在至少一个weak_ptr。如果共享指针是使用make_shared创建的,这意味着对象的整个内存都保持分配状态。 (对象本身被正确销毁,但由于控件块和对象的内存分配在一个块中,如make_shared所做的那样,它们只能一起解除分配。)

我的理解是否正确?

似乎这种行为代表了一个问题,例如在着名的"cache example"中。对象的内存将永远分配。

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

2 个答案:

答案 0 :(得分:11)

  

我的理解是否正确?

是。如果你的weak_ptr显着超过(大)对象并且记忆力很差,那么避免make_shared可能是有益的。

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

答案 1 :(得分:2)

我在VS2013中尝试了这个,你完全正确。销毁最后一个shared_ptr时会调用析构函数,因此与该对象关联的任何其他对象或内存都将被销毁,但如果使用make_shared创建shared_ptr,则内存永远不会被销毁,直到最后一个weak_ptr为止。

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