c++11 - C++ 入门 5 版:shared_ptr 的容器
问题描述
再次阅读 C++ Primer 5 Edition。我在第 12 章动态记忆。一切都好。直到本书中的这一点:
“因为在最后一个 shared_ptr 消失之前内存不会被释放,因此确保 shared_ptr 在不再需要后不会留下来很重要。程序将正确执行,但如果您忽略破坏 shared_ptr 可能会浪费内存程序不需要。shared_ptrs 在您需要它们后可能会保留的一种方法是,如果您将 shared_ptrs 放入容器中,然后重新排序容器,这样您就不需要所有元素。您应该确保删除 shared_ptr 元素一次您不再需要这些元素。
笔记
如果您将 shared_ptrs 放入容器中,并且随后需要使用部分但不是全部元素,请记住删除不再需要的元素。”
- 我不明白这一段,有人可以向我解释一下
shared_ptr
s 是如何泄漏的吗?以及可能导致泄漏的 shared_ptr 的“容器”示例。谢谢你。
解决方案
这本质上意味着只要std::shared_ptr
您的容器中有一个对象,它指向的对象就不会被删除。
因此,一旦您不再使用该对象,您应该std::shared_ptr
从容器中删除相应的对象,以便释放存储空间。
如果您要继续向容器中添加元素并且从不删除任何元素,那么您实际上会泄漏内存(当引用计数达到 0 时它将被清除,但在那之前它会无缘无故地保留)。
旁注,请确保您始终考虑使用std::shared_ptr
. 通常一个std::unique_ptr
就足够了,如果需要让它共享它很容易做到这一点。请参阅C++11 unique_ptr 和 shared_ptr 是否能够转换为彼此的类型?
还
https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-unique
推荐阅读
- vba - 插入单元格并仅向下移动单元格
- react-native - react-native useFocusEffect "holdings" 是只读错误
- python - 在 Pygame 中 n 秒后将间隔减少 n
- powershell - iTextSharp 5 AcroFields [PowerShell] 中的“丢失”字形
- php - 添加特定月份的记录
- mysql - 更新级联上的Mysql不适用于树表
- python - 当你在不同的形状上使用 tensorflow.keras.layers.Add 会发生什么?
- ssl - 如何从 Insomnia REST Client 创建 SSL 密钥日志?
- ruby - 使用 RSpec 生成不泄漏的动态测试的最佳方法(LeakyConstantDeclaration 问题)?
- npm - React-snap 无法抓取 pdf 文件?