我正在尝试制作一个能够以正确顺序绘制等距游戏实体的算法。我的实体存储在指针向量中。
在绘图函数中,我首先创建一个相同指针的新向量,然后从for循环开始,循环我想要绘制的实体数量。在该循环内部还有另一个循环,它确定要绘制的实体,并且在绘制实体时,使用vector.erase()从矢量中删除指针,因此同一实体不会被绘制两次(这就是为什么我正在创建包含实体指针的向量副本。
无论如何,我的代码本身工作,实体按照我想要的方式绘制,但我似乎有内存泄漏(我实际上可以看到Windows任务管理器中的内存爬升了28 kb / s)。
即使我超出了除此之外的所有内容,内存泄漏仍然存在:
vector<Entity*> list = ent_list; // ent_list is the list of entity pointers
list.clear();
所以我想我错过了什么,但我不确定是什么。我想,因为我没有使用“新”,记忆会被照顾,但显然不是......希望有人可以帮助我!
/费奥多尔
答案 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>
替换容器元素。这可能会清理使用向量的代码,并提供指向更好的内存管理标准实践的指针。