这是std :: vector的正常行为吗?

jma*_*erx 1 c++ memory vector

我有一个名为OGLSHAPE的类的std :: vector.

每个形状都有一个SHAPECONTOUR结构的向量,它有一个float向量和一个double向量的向量.它还有一个大纲结构的向量,其中包含一个float向量.

最初,我的程序使用8.7 MB的ram启动.我注意到,当我开始填充这些时,加上双打和浮子,记忆得到很快,然后稳定下来.当我清除OGLSHAPE向量时,仍然使用大约19MB.然后,如果我推出大约150多个形状,然后清除那些,我现在使用大约19.3MB的内存.从逻辑上讲,如果它第一次从8.7变为19,那么下一次它会达到30左右.我不确定它是什么.我以为是内存泄漏,但现在我不确定.我所做的只是将数字推入std :: vectors,没有别的.所以我希望能回忆起我的全部记忆.什么可能导致这个?

谢谢

*编辑,好吧它的内存碎片分配了很多小东西,怎么能解决?

hka*_*ser 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);
Run Code Online (Sandbox Code Playgroud)

它会创建一个新的(空)实例,并将其与您想要清除的矢量实例交换.