C++ 如何正确删除向量中的对象

C++ 如何正确删除向量中的对象,c++,memory-leaks,vector,C++,Memory Leaks,Vector,在我的简单游戏引擎中,我有一个包含指向实体指针的向量。每个实体都分配了新关键字。要在实体上调用函数,我使用迭代器,因此当删除实体时,我想我也会使用迭代器,如下所示: vector<Entity*>::iterator iter; for (iter = gameEntitys.begin(); iter != gameEntitys.end();) { delete (*iter); ++iter; } vector::迭代器iter; for(iter=gameE

在我的简单游戏引擎中,我有一个包含指向实体指针的向量。每个实体都分配了新关键字。要在实体上调用函数,我使用迭代器,因此当删除实体时,我想我也会使用迭代器,如下所示:

vector<Entity*>::iterator iter;
for (iter = gameEntitys.begin(); iter != gameEntitys.end();) {
    delete (*iter);
    ++iter;
}
vector::迭代器iter;
for(iter=gameEntitys.begin();iter!=gameEntitys.end();){
删除(*国际热核实验堆);
++iter;
}
但我现在有一个可怕的内存泄漏,所有分析工具都指向
delete(*iter)

显然有问题,但我删除向量中包含的实体(并清除另一个场景的向量)的正确方法是什么。使用
gameEntitys.clear()是无用的,因为它只删除向量的元素,而不实际调用delete,因为它们是指针而不是实际数据

编辑:我一直在看评论。实体类不是多态的,并且没有任何子类。如果我停止使用动态内存并拥有一个非指针实体的普通数组,这会更有意义吗


我知道存在内存泄漏的原因是,当应用程序启动时,内存使用量在崩溃前激增到2gb以上。

最有可能的原因是,内存泄漏来自
实体的析构函数或其子类之一:您正在正确执行
删除
操作,因此,析构函数本身肯定有故障。一个常见的问题是在多态类层次结构中不使析构函数成为虚拟的

关于调用
gameEntitys.clear()的无用性,您也完全正确:它会“忘记”对对象的引用,从而“大量”泄漏对象

如果您在C++ 11上,请考虑更改定义以使用< /P>

std::向量配子体;
这将使您无需手动管理条目的内存,同时可以在
向量中保留指向派生类对象的指针。如果使用
unique\u ptr
,调用
gameEntitys.clear()
将销毁vector元素指向的项目

处理
unique_ptr
的向量有些不同(例如,插入新项目需要格外小心,请参阅以了解详细信息),但我认为简化内存管理的优点弥补了这些轻微的不便


<> > >编辑:因为您的<代码>实体类不是多态的,请考虑切换到<代码> STD::vector < /代码>,除非稍后计划切换到多态层次结构。 这就是
unique\u ptr
的作用:)您是如何确定内存泄漏的?您显示的代码将删除
gameEntitys
对象中的所有指针;在这样做之后,你当然应该
clear()
it。问题是他为什么首先在这里使用动态分配。在我们知道这一点之前,以及他在向量上做的其他事情之前,我们不能说他应该做什么。(在这种情况下,先验地,解决方案是
std::vector
。但是类的名称让我怀疑还有其他东西在起作用。)还有一个猜测:他在使用指针,因为对象是多态的。而
实体
没有虚拟析构函数。@Kerrek:我假设,“与我目前正在做的事情相比,这似乎是不正确的,这是正确的”。但是你是对的,它是多余的。这也会改变访问向量的语法。他不能直接读入
实体*
,因为没有隐式转换。他当然不想读入一个
std::unique\u ptr
,因为这会导致向量中出现一个死指针。@JamesKanze谢谢你的提醒,我改变了答案,提到
std::unique\u ptr
不是一个替代品。多谢各位+1.如果不能使用c++11和std::unique_ptr,也可以用同样的方法使用boost shared_ptr,但是当修改向量时,会为ref计数带来一些开销。问题是实体类不是多态的,它没有子类,在它的构造函数中也没有可以删除的东西?@JohanLundberg,但是如果
Entity
意味着我认为它的意思,那么与其他部分相比,开销是无法衡量的。
std::vector<std::unique_ptr<Entity> > gameEntitys;