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超出范围,它也不会减less。 有人可以点亮一些吗?

第一件事:

任务管理器!=内存分析器

操作系统(或更具体的C运行时系统)肯定会缓存你分配的一些内存。

请注意,操作系统通常不是愚蠢的 – 如果应用程序没有使用内存,并且操作系统需要更多的内存来满足其他程序的内存需求,则会相应地进行分配。 但是,如果情况并非如此(大部分时间不是这样),那么保持应用程序的重复使用是一个成功的策略。

由于这些优化,您实际上无法使用任务管理器来获取应用程序内存使用情况的准确视图。

第二件事:

像所有非愚蠢的动态数组类一样,即使在需要再次使用内存缓冲区时删除所有元素, CArray也不会释放支持数组的内存。 如果删除底层内存缓冲区,仅仅发现需要浪费更多的处理器周期来重新分配另一个缓冲区来处理可能在CArray::RemoveAll()之后出现的下一个CArray::Append()调用, CArray::RemoveAll()

如果你真的想摆脱这个额外的空间,使用CArray :: FreeExtra() 。 请注意,该函数可能涉及分配一个新的缓冲区,并将元素复制到新的缓冲区,然后删除旧的缓冲区。

正如其他人所说,RemoveAll不释放CArray分配的内存,您需要调用CArray :: FreeExtra。

你说在CArray的析构函数之后内存不会下降。 CArray :: SetSize从堆中分配内存,CArray的析构函数释放它。 但是,这并不意味着堆内存回馈给操作系统。

当你使用MFC时,我建议你不时在调试器中启动你的程序。 MFC调试应用程序在MFC清理期间打印出他们的内存泄漏(基于新的)。

您需要在RemoveAll后调用FreeExtra以恢复内存。 我猜这是为了避免堆碎片。