21

a 的控制块shared_ptr在至少存在一个时保持活动状态weak_ptr。如果共享指针是用它创建的make_shared,则意味着对象的整个内存都保持分配状态。(对象本身已被适当地破坏,但由于控制块和对象的内存被分配在一个块make_shared中,因此它们只能一起释放。)

我的理解正确吗?

这种行为似乎代表了一个问题,例如在著名的“缓存示例”中。对象的内存将永远分配。

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

4

2 回答 2

15

我的理解正确吗?

是的。如果您weak_ptr的 s 显着超过(大)对象并且您的内存很紧,那么避免make_shared.

然而,这里的“大”是用 来衡量的,sizeof许多概念上的“大”对象(例如,大多数标准容器,除了std::array当对象被破坏时。

于 2015-08-20T09:23:48.873 回答
2

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

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

于 2015-08-20T09:38:54.930 回答