c++ - CArray 不取消分配内存

标签 c++ arrays windows memory mfc

我有一个非常简单的问题,我似乎对发生的一切感到困惑。看下面的代码:

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/

相关文章:

windows - 本地测试 : make a second DocumentRoot in XP?

windows - 对 ContentPresenter 非常困惑

c++ - CMake目录层次结构,独立构建子目录

c++ - 将 Mat 元素 (uchar) 写入 .csv

java - 如何比较 arraylist 中的 int[] 元素?

c - 如何解决c类型转换中的这个错误?

windows - Xampp Apache无法启动。 (不是端口问题,Xampp崩溃了)

c++ - 错误 : Cannot use typeid with -fno-rtti

C++获取字符串数组的大小

c - 如何使用指针正确地将字符串输入存储到字符数组中?