删除包含包含动态对象的 STL 容器的智能指针
Deleting smart pointers containing STL containers containing dynamic objects
如果有一个指向 STL 容器的智能指针,该容器包含在其他位置管理的原始指针,则当智能指针解除分配容器时,是否会删除原始指针?
对于上下文,我正在为一个游戏编写一个碰撞检测系统,该系统需要存储在任何给定时间相互碰撞的游戏实体对的临时列表,对我来说,将此列表存储为
std::array<std::unique_ptr<std::array<gameEntity *, 2>>, SOME_LARGE_NUMBER>
以便可以根据需要分配和取消分配包含对的子数组。话虽如此,gameEntity 指针在程序其他地方的中央列表中进行管理,如果unique_ptr将数组的内容与数组一起释放,那将是灾难性的。我从其他来源的理解是,当管理对象的生存期不是一个问题时,智能指针不是必需的,这就是为什么我在这里只使用原始指针,以及shared_ptrs会增加不必要的开销的事实,这是在性能关键应用程序中的热代码路径中。
所以我的问题是,当智能指针解除分配数组时,数组内的原始指针会被释放吗?
编辑:它可能不是一个热代码路径,这取决于你的定义;典型的用法是每帧进行10-100个这样的数组分配,这是1/30或1/60秒,具体取决于情况,我不知道这是否符合条件。但是,无论如何,它仍然是一个性能密集型应用程序。
答案是否定的。解除分配原始指针(无论是否在容器中(永远不会删除它指向的内容。您必须使用delete
显式执行此操作,或者获取智能指针来为您执行此操作,或者使其超出范围。
例如:
auto arr_ptr = std::make_unique<std::array<int*, 2>>();
(*arr_ptr)[0] = new int(5);
(*arr_ptr)[1] = new int(9);
arr_ptr.reset(); // this is a memory leak!!
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制