我需要帮助了解我在 Windows 上的内存分配和释放问题。我目前正在使用 VS11 编译器 (VS2012 IDE) 和最新更新 (Update 3 RC)。
问题是:我正在为二维数组动态分配一些内存并立即释放它。尽管如此,在内存分配之前,我的进程内存使用量在分配之前是 0,3 MB,在分配时是 259,6 MB(预计因为分配了 32768 个 64 位整数(8 字节)数组),在分配期间是 4106,8 MB,但在释放内存后,内存并没有下降到预期的 0.3 MB,而是停留在 12.7 MB。由于我正在释放我占用的所有堆内存,因此我预计内存会恢复到 0.3 MB。
这是我正在使用的 C++ 代码:
#include <iostream>
#define SIZE 32768
int main( int argc, char* argv[] ) {
std::getchar();
int ** p_p_dynamic2d = new int*[SIZE];
for(int i=0; i<SIZE; i++){
p_p_dynamic2d[i] = new int[SIZE];
}
std::getchar();
for(int i=0; i<SIZE; i++){
for(int j=0; j<SIZE; j++){
p_p_dynamic2d[i][j] = j+i;
}
}
std::getchar();
for(int i=0; i<SIZE; i++) {
delete [] p_p_dynamic2d[i];
}
delete [] p_p_dynamic2d;
std::getchar();
return 0;
}
最佳答案
我确定这是重复的,但无论如何我都会回答:
如果您正在查看任务管理器大小,它会为您提供进程的大小。如果没有“压力”(您的系统有足够的可用内存,并且没有进程处于饥饿状态),那么减少进程的虚拟内存使用是没有意义的——进程增长、收缩、增长并不罕见,以循环模式收缩,因为它在处理数据时进行分配,然后释放在一个处理周期中使用的数据,为下一个周期分配内存,然后再次释放它。如果操作系统要“重新获得”这些内存页面,只需要将它们再次返回给您的进程,那将是对处理能力的浪费(将页面分配和取消分配给特定进程并非完全微不足道,尤其是如果你不能确定这些页面首先属于谁,因为它们需要被“清理”[填充零或其他一些常量以确保“新所有者”不能使用内存来“钓鱼”旧数据”,例如找到我存储在内存中的密码])。
即使页面仍然属于这个进程的所有权,但没有被使用,实际的 RAM 可以被另一个进程使用。因此,如果这些页面有一段时间没有发布,这没什么大不了的。
此外,在 Debug模式下,C++ 运行时将在所有经过delete
的内存中存储“此内存已被删除”。这是为了帮助识别“免费后使用”。因此,如果您的应用程序在 Debug模式下运行,那么不要指望任何释放的内存都会被释放。它会被重复使用。因此,如果您将代码运行三次,它的大小不会增长到原来的三倍。
关于C++ delete 不释放所有内存 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008180/