我有一个非常简单的问题,我似乎对发生的一切感到困惑。看下面的代码:
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
超出范围时它也不会减少。有人可以阐明 nthis 吗?
最佳答案
第一件事:
任务管理器 != 内存分析器
操作系统(或更具体地说,C 运行时系统)肯定会缓存您分配的一些内存。
请注意,操作系统通常并不笨——如果应用程序未使用内存,而操作系统需要更多内存来满足某些其他程序的内存需求,它会相应地进行分配。但如果情况并非如此(大多数情况下并非如此),那么将其保留以供应用程序重用是一个成功的策略。
由于这些优化,您实际上无法使用任务管理器来准确查看应用程序的内存使用情况。
第二件事:
像所有非愚蠢的动态数组类一样,CArray
不会释放支持数组的内存,即使您删除了所有元素以防您需要再次使用内存缓冲区。删除底层内存缓冲区只是为了发现您需要浪费更多的处理器周期来重新分配另一个缓冲区来处理您的下一个 CArray::Append()
调用,这将是对处理器周期的极大浪费可能会在 CArray::RemoveAll()
之后出现。
如果你真的想摆脱那个额外的空间,使用CArray::FreeExtra() .请注意,该函数可能涉及分配新缓冲区并将元素复制到新缓冲区,然后删除旧缓冲区。
关于c++ - CArray 不取消分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8179321/