我有一个名为OGLSHAPE的类的std :: vector。
每个形状都有一个SHAPECONTOUR结构的向量,它有一个float向量和一个向量为double的向量。它还有一个大纲结构的向量,其中包含一个float向量。
最初,我的程序使用8.7 MB的ram启动。我注意到,当我开始填充这些时,加上双打和浮子,记忆得到相当高的速度,然后稳定下来。当我清除OGLSHAPE向量时,仍然使用大约19MB。然后,如果我推出大约150多个形状,然后清除那些,我现在使用大约19.3MB的内存。从逻辑上讲,如果它第一次从8.7变为19,那么下一次它会达到30左右。我不确定它是什么。我以为是内存泄漏,但现在我不确定。我所做的只是将数字推入std :: vectors,没有别的。所以我希望能回忆起我的全部记忆。什么可能导致这种情况?
由于
*编辑,好吧它的内存碎片 分配很多小东西, 怎么能解决?
答案 0 :(得分:8)
调用std :: vector<> :: clear()不一定释放所有已分配的内存(它取决于std :: vector<>的实现)。这通常是为了优化目的而进行的,以避免不必要的内存分配。
为了真正释放实例所拥有的内存,请执行以下操作:
template <typename T>
inline void really_free_all_memory(std::vector<T>& to_clear)
{
std::vector<T> v;
v.swap(to_clear);
}
// ...
std::vector<foo> objs;
// ...
// really free instance 'objs'
really_free_all_memory(objs);
创建一个新的(空)实例,并将其与您想要清除的矢量实例交换。
答案 1 :(得分:0)
使用正确的工具来观察您的内存使用情况,例如: (在Windows上)使用Process Explorer并观察Private Bytes。不要查看虚拟地址空间,因为它显示了正在使用的最高内存地址。碎片化是导致两个值之间存在巨大差异的原因。
还要意识到应用程序和操作系统之间存在很多层:
答案 2 :(得分:0)
这里有一些可能发生的事情。
首先,内存在大多数常见的C和C ++运行时库中的工作方式是,一旦从操作系统将其分配给应用程序,它很少会被返回给操作系统。当您在程序中释放它时,new
内存管理器会保留它,以防您再次请求更多内存。如果你这样做,它会让你重新使用它。
另一个原因是矢量本身通常不会减小它们的大小,即使你清除它们也是如此。他们保持最高的“容量”,以便更快地重新填充它们。但是如果向量被破坏,那么该内存将返回运行时库再次分配。
所以,如果你没有摧毁你的向量,他们可能会在内部为你保留内存。如果您正在使用操作系统中的某些内容来查看内存使用情况,则可能不知道要使用的运行时库中有多少“空闲”内存,而不是返回给操作系统。
你的内存使用量略有增加(而不是根本没有增加)的原因可能是因为碎片。这是一种复杂的切线,但足以说分配大量小对象会使运行时库更难以在需要时找到大块。在这种情况下,它不能重复使用它已经释放的一些内存,因为它有许多小块。所以它必须进入操作系统并请求一大块。