使用 std::make_shared 后可以缓存吗?

时间:2021-03-17 17:55:54

标签: c++ effective-c++

我正在阅读 Effective Modern C++ (Scott Meyers) 并尝试了第 21 项中的一些内容。这本书说使用 std::make_shared 的副作用是内存无法释放,直到所有 shared_ptr 和 { {1}} 没有了(因为控制块与内存一起分配)。

我预计这意味着如果我在缓存周围保存一堆 weak_ptr ,则永远不会释放任何内存。我使用下面的代码尝试了这个,但是当 shared_ptrs 从向量中删除时,我可以看到使用 pmap 内存实际上被释放了。谁能解释我哪里出错了?还是我的理解有误?

注意:函数 weak_ptr 与本书中用于本实验目的不同。

loadWidget

1 个答案:

答案 0 :(得分:2)

确实,当您使用 std::make_shared 时,新对象和控制块的存储被分配为单个块,因此只要存在 std::weak_ptr 就不会释放它它。但是,当最后一个 std::shared_ptr 被销毁时,对象仍然被销毁(它的析构函数运行并且它的成员被销毁)。只是相关联的存储空间仍处于分配和未占用状态。

std::vector 为其元素动态分配存储空间。此存储位于 std::vector 外部,它不是对象内存表示的一部分。当您销毁一个 Widget 时,您也同时销毁了它的 std::vector 成员。该成员的析构函数将释放用于存储其元素的动态分配的内存。唯一不能立即释放的内存是控制块和 Widget 的存储(应该是 sizeof(Widget) 字节)。它不会阻止立即释放向量元素的存储。

相关问题