又一个C ++向量内存泄漏问题

时间:2010-09-01 11:32:47

标签: c++ memory-leaks vector

我正在尝试制作一个能够以正确顺序绘制等距游戏实体的算法。我的实体存储在指针向量中。

在绘图函数中,我首先创建一个相同指针的新向量,然后从for循环开始,循环我想要绘制的实体数量。在该循环内部还有另一个循环,它确定要绘制的实体,并且在绘制实体时,使用vector.erase()从矢量中删除指针,因此同一实体不会被绘制两次(这就是为什么我正在创建包含实体指针的向量副本。

无论如何,我的代码本身工作,实体按照我想要的方式绘制,但我似乎有内存泄漏(我实际上可以看到Windows任务管理器中的内存爬升了28 kb / s)。

即使我超出了除此之外的所有内容,内存泄漏仍然存在:

vector<Entity*> list = ent_list; // ent_list is the list of entity pointers
list.clear();

所以我想我错过了什么,但我不确定是什么。我想,因为我没有使用“新”,记忆会被照顾,但显然不是......希望有人可以帮助我!

/费奥多尔

4 个答案:

答案 0 :(得分:4)

vector :: clear的引用说:“如果向量的元素是指向对象的指针,则此函数不会调用相应的析构函数”。你确定你不依赖于此吗?

答案 1 :(得分:1)

不,标准容器只擦除他们创建的内存; std::list.clear();只会使迭代器本身无效并删除,而不是你已分配的内存。

你必须在每个迭代器之后调用std::list.remove()std::list.erase(),并手动删除你自己分配的指针。

答案 2 :(得分:1)

向量不会删除指针后面的内存。在调用clear()之前,您必须删除每个Entity *,或者您可以使用“智能容器”作为boost::ptr_vector

答案 3 :(得分:0)

更正此问题的最简单方法是使用boost::shared_ptr<Element>替换容器元素。这可能会清理使用向量的代码,并提供指向更好的内存管理标准实践的指针。

相关问题