我有一个非常简单的问题,我似乎被困在发生的事情。请看下面的代码:CArray没有取消分配内存
CArray<double, double&> arr;
arr.SetSize(50000);
for(int i =0; i< 50000; i++)
{
arr[i] = (i+2)*3.14f;
}
arr.RemoveAll();
我会假设,RemoveAll()
后,内存将被释放,但现在看来似乎没有发生。要检查内存占用情况,请打开Taskmanager并观察exe的内存。它在arr.SetSize()
呼叫上增加,但即使此arr
超出范围,它也不会减少。有人可以对此进行阐述吗?
我试过FreeExtra,但它仍然无法正常工作。我知道任务管理器不是内存分析器,但这是最容易获得的东西。还有其他建议吗? – Aamir
@In Silico,为什么FreeExtra需要分配一个新的缓冲区来减小大小?当然,如果它使用realloc来缩小所使用的内存量,最终会产生碎片堆,那么可以避免额外堆空间的内存开销以及复制和调用ctors和dtors的时间开销。 –
@Shane MacLaughlin:这是一种可行的方法。但是,文档没有具体说明也没有做出任何保证,让它像那样工作(我已经重写了这句话)。它不是普遍的;例如'std :: vector'几乎肯定会分配一个新缓冲区并删除旧缓冲区,因为分配器接口没有'realloc()'能力。 –