4

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

vector<Entity*>::iterator iter;
for (iter = gameEntitys.begin(); iter != gameEntitys.end();) {
    delete (*iter);
    ++iter;
}

但是我现在有一个可怕的内存泄漏,所有分析工具都指向这条线delete (*iter);

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

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

我知道存在内存泄漏的原因是,当应用程序启动时,内存使用量在崩溃之前会飙升至 2gb 以上。

4

1 回答 1

7

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

你对调用的无用也是绝对正确的gameEntitys.clear():它会通过“忘记”对它们的引用来“批发”你的对象。

如果您使用的是 C++11,请考虑更改要使用的定义std::unique_ptr

std::vector<std::unique_ptr<Entity> > gameEntitys;

这将使您无需手动管理条目的内存,同时让您将指向派生类对象的指针保存在vector. 如果你使用unique_ptr,调用gameEntitys.clear()将破坏向量元素指向的项目。

处理的向量unique_ptr有些不同(例如,插入新项目需要格外小心,有关详细信息,请参阅此答案),但我认为简化内存管理的积极意义弥补了轻微的不便。

编辑:由于您的Entity类不是多态的,请考虑切换到std::vector<Entity>,除非您打算稍后切换到多态层次结构。

于 2012-10-01T17:07:28.393 回答