如果您有一个指向STL容器的智能指针,其中包含在其他地方管理的原始指针,那么当智能指针取消分配容器时,原始指针会被删除吗?
对于上下文,我正在为游戏编写一个碰撞检测系统,该系统需要存储在任何给定时间相互碰撞的成对游戏实体的临时列表,对我而言,最有意义的存储方式是此列表为
std::array<std::unique_ptr<std::array<gameEntity *, 2>>, SOME_LARGE_NUMBER>
,以便可以根据需要分配和释放包含这些对的子数组。就是说,gameEntity指针是在程序中其他地方的中央列表中管理的,如果unique_ptr与数组一起释放数组的内容,那将是灾难性的。我从其他来源得到的理解是,在管理对象的生存期不是问题时,智能指针不是必需的,这就是为什么我在这里只使用原始指针,以及shared_ptrs会增加不必要的开销这一事实,这在性能至关重要的应用程序的热代码路径中。
所以我的问题是,当智能指针释放数组时,数组内的原始指针会被释放吗?
编辑:根据您的定义,它可能不是热门代码路径;通常情况下,每帧都会看到10-100个数组分配,取决于情况,这是1/30或1/60秒,我不知道这是否符合条件。无论如何,从整体上看,它仍然是一个性能密集型应用程序。
答案 0 :(得分:1)
答案是否。释放原始指针(无论是否在容器中)都不会删除其指向的对象。您必须使用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!!