visual c++ delete不会释放所有内存(Windows)

visual C++ delete does not free all memory (Windows)

本文关键字:内存 Windows 释放 c++ delete visual      更新时间:2023-10-16

我需要帮助来理解我在Windows上的内存分配和释放问题。我正在使用VS11编译器(VS2012 IDE),目前最新更新(更新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;
}

我确定这是重复的,但我还是要回答:

如果您正在查看任务管理器大小,它将给您进程的大小。如果没有"压力"(您的系统有足够的可用内存,并且没有进程处于饥饿状态),那么减少进程的虚拟内存使用是没有意义的——进程在处理数据时以循环模式增长、收缩、增长、收缩,然后释放在一个处理周期中使用的数据,为下一个处理周期分配内存,然后再次释放内存,这种情况并不罕见。如果操作系统"恢复"这些页面的内存,只需要给他们再次回到你的过程,这将是一个浪费的处理能力(将和unassigning页面分配给一个特定的过程并不完全微不足道的,特别是如果你不能确定这些页面属于首先,因为他们需要"清洗"充满了零个或其他一些常数,确保"新主人"不能使用内存旧数据的"钓鱼",例如查找存储在内存中的密码])。

即使页面仍然属于这个进程,但是没有被使用,实际的RAM也可以被另一个进程使用。因此,如果页面有一段时间没有发布,也没什么大不了的。

此外,在调试模式下,c++运行时将在经过delete的所有内存中存储"此内存已被删除"。这是为了帮助识别"免费后使用"。因此,如果您的应用程序在调试模式下运行,那么永远不要期望释放任何已释放的内存。它会被重复使用。因此,如果您将代码运行三次,它的大小不会增长到原来的三倍。