微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 std::make_shared 后可以缓存吗?

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

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

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

loadWidget

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。