C++ delete不释放所有内存(Windows)

use*_*906 6 c++ memory-leaks memory-management heap-memory visual-c++

我需要帮助了解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;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 10

我确定这是重复的,但无论如何我都会回答:

如果您正在查看任务管理器大小,它将为您提供进程的大小.如果没有"压力"(您的系统有足够的可用内存,并且没有任何进程被匮乏),那么减少进程的虚拟内存使用是没有意义的 - 进程增长,缩小,增长并不罕见在处理数据时分配的循环模式缩小,然后释放在一个处理周期中使用的数据,为下一个循环分配内存,然后再次释放它.如果操作系统要"重新获得"那些内存页面,只需要再次将它们返回到您的进程,这将浪费处理能力(为特定进程分配和取消分配页面并非完全无关紧要,尤其是如果你不能确定那些页面属于哪个页面,

即使页面仍然保留在此进程的所有权中,但未被使用,实际的RAM也可以被另一个进程使用.因此,如果页面尚未发布一段时间,那么这不是什么大问题.

此外,在调试模式下,C++运行时将在所有经过的内存中存储"此内存已被删除" delete.这有助于识别"免费使用".因此,如果您的应用程序在调试模式下运行,那么不要期望释放任何释放的内存.它将被重用.因此,如果您运行三次代码,它将不会增长到三倍.