删除包含包含动态对象的 STL 容器的智能指针

Deleting smart pointers containing STL containers containing dynamic objects

本文关键字:智能 指针 STL 删除 动态 对象 包含包      更新时间:2023-10-16

如果有一个指向 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!!