Aam*_*mir 3 c++ memory windows arrays mfc
我有一个非常简单的问题,我似乎对所发生的事情感到难过.看下面的代码:
CArray<double, double&> arr;
arr.SetSize(50000);
for(int i =0; i< 50000; i++)
{
arr[i] = (i+2)*3.14f;
}
arr.RemoveAll();
Run Code Online (Sandbox Code Playgroud)
我会假设之后RemoveAll()
,内存将被释放,但似乎没有发生.要检查内存占用,请打开Taskmanager并观察exe的内存.它随着时间的推移arr.SetSize()
而增加,但即使arr
超出范围也不会减少.有人可以透露一下吗?
第一件事:
操作系统(或更具体地说是C运行时系统)肯定会缓存您分配的一些内存.
请注意,操作系统通常不是愚蠢的 - 如果应用程序没有使用它的内存,并且操作系统需要更多内存来满足其他程序的内存需求,它将相应地进行分配.但如果情况并非如此(大部分时间都不是这样),那么保留它以供应用程序重用时才是一个成功的策略.
由于这些优化,您实际上无法使用任务管理器来准确查看应用程序的内存使用情况.
第二件事:
与所有非愚蠢的动态数组类一样,CArray
即使在需要再次使用内存缓冲区时删除所有元素,也不会释放支持数组的内存.删除底层内存缓冲区只是为了发现你需要浪费更多的处理器周期来重新分配另一个缓冲区来处理你的下一个CArray::Append()
调用,这可能是一个非常浪费的处理器周期CArray::RemoveAll()
.
如果你真的想摆脱这个额外的空间,可以使用CArray :: FreeExtra().请注意,该函数可能涉及分配新缓冲区并将元素复制到新缓冲区,然后删除旧缓冲区.