Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 还有一个C++;向量内存泄漏问题_C++_Memory Leaks_Vector - Fatal编程技术网

C++ 还有一个C++;向量内存泄漏问题

C++ 还有一个C++;向量内存泄漏问题,c++,memory-leaks,vector,C++,Memory Leaks,Vector,我正在尝试做一个算法,它可以按照正确的顺序绘制等距游戏的实体。我的实体存储在指针向量中 在绘图函数中,我首先创建一个相同指针的新向量,然后从一个for循环开始,该循环循环我想要绘制的实体数量。在该循环中还有另一个循环,它确定要绘制的实体,当绘制实体时,它的指针将使用vector.erase()从向量中移除,因此同一实体不会绘制两次(这就是为什么我要创建包含实体指针的向量副本) 无论如何,我的代码本身是有效的,实体是按照我想要的方式绘制的,但我似乎有内存泄漏(我可以在Windows任务管理器中看到

我正在尝试做一个算法,它可以按照正确的顺序绘制等距游戏的实体。我的实体存储在指针向量中

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

无论如何,我的代码本身是有效的,实体是按照我想要的方式绘制的,但我似乎有内存泄漏(我可以在Windows任务管理器中看到内存以28 kb/s的速度增长)

即使我对除以下内容以外的所有内容都进行了注释,内存泄漏仍然存在:

vector<Entity*> list = ent_list; // ent_list is the list of entity pointers
list.clear();
vector list=ent\u list;//entu list是实体指针的列表
list.clear();
所以我想我遗漏了什么,但我不确定是什么。我想,因为我没有使用“新”的内存将得到照顾,但显然它不是。。。希望有人能帮助我


/feodor

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

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



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

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

最简单的纠正方法是将容器元素替换为
boost::shared\u ptr
。这可能会清理使用向量的代码,并提供一个指向更好的内存管理标准实践的指针。

实体对象是如何创建的?你说你不使用new,是不是有些库代码代表你使用new?@jk我想他的意思是他没有在列表中使用new…任务管理器不能帮助确定内存泄漏。您可以更正并释放所有内存,使用的内存量仍不会下降(在任务管理器中)。另一种情况是英文描述优于源代码。您知道,如果您只提供一个小的可编译示例来演示问题,那么下面的所有猜测都是可以避免的。我在这里支持Martin,请发布仍然存在问题的源代码摘录(尽可能小)。你可能有一个bug,但现在还不知道,下面的大多数答案都是毫无用处的,因为我们不知道它们是否适用于你当前的情况……或者可能使用智能指针,以便自动处理。OP中使用的clear()无法实现与erase(remove())相同的功能.很难判断智能指针是否能起到任何作用。目前尚不清楚该列表是在管理资源,还是仅仅持有指向已管理变量的指针。像这样的投机是适得其反的。如果你不知道发生了什么,在评论部分问一个问题。你怎么知道指针需要管理。没有足够的信息来实现这种飞跃。@Martin York我想我不明白。。。事实上,这个问题有点模糊,但从这个问题提供的信息来看,他似乎希望为向量包含的指针分配的内存可以通过调用向量上的clear()来释放。我不确定我在做什么样的飞跃……飞跃:甚至有内存泄漏。如果没有内存泄漏,那么他可能有指向向量中基于堆栈的对象的指针(在使用new的问题中,我甚至没有从英文散文中看到任何转瞬即逝的东西)。如果您现在建议使用boost::ptr_vector,那么应用程序很可能会爆炸并混淆OP。您在没有证据支持您的理论的情况下得出结论。不要猜测解决方案,向OP提问,并尝试确认这就是问题所在。谢谢Martin。我的断言是,原始问题中有足够的信息表明Entity*指针在两个向量之间共享。因此,在调用clear()之前执行循环和删除操作,在正确清理原始向量时,或者该向量不是clear()-ed时,只需将泄漏替换为崩溃。无论如何,目标实体*的所有权都不清楚。boost::shared_ptr(或其他替代方案)正好解决了这个问题,在容器和成员超出范围时正确清理它们,而不管存在多少对实体的引用。如果存在,则大。询问OP你的假设是否正确。猜测会适得其反。+1对我来说似乎是个不错的猜测。因为没有任何问题是完美的,猜测是过程中必不可少的一部分。SO答案可以为一个模糊的问题提供一个可能的答案,然后随着更多信息的出现而被细化。@Daniel Earwicker:但给出上面的问题不会有任何错误。OP根据“任务管理器”的输出猜测他们有内存泄漏(这是不可能做到的事情)。因此,这个猜测是试图修复一个可能并不存在的问题,从而给OP带来很多困难,因为他们开始删除不应该删除的指针。所以我认为这比帮助更有害。请注意,这个问题得到的批评最少,因为实际上没有人试图说删除指针。当然,可能没有错误-但当有人在愚弄智慧时,最有可能的是什么