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

时间:2013-06-09 09:18:08

标签: c++ visual-c++ memory-management memory-leaks heap-memory

我需要帮助了解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;
}

1 个答案:

答案 0 :(得分:10)

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

如果您正在查看任务管理器大小,它将为您提供进程的大小。如果没有“压力”(您的系统有足够的可用内存,并且没有任何进程被匮乏),那么减少进程的虚拟内存使用是没有意义的 - 进程增长,缩小,增长并不罕见在处理数据时分配的循环模式缩小,然后释放在一个处理周期中使用的数据,为下一个循环分配内存,然后再次释放它。如果操作系统要“重新获得”那些内存页面,只需要再次将它们返回到您的进程,这将浪费处理能力(为特定进程分配和取消分配页面并非完全无关紧要,尤其是你不能确定那些页面属于谁首先,因为他们需要“清理”[填充零或其他常数以确保“新主人”不能使用记忆“钓鱼为旧数据“,例如查找存储在内存中的密码”)。

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

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