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

6
我需要帮助理解在Windows上内存分配和释放的问题。我正在使用VS11编译器(VS2012 IDE)和最新的更新(Update 3 RC)。
问题是:我动态分配了一些内存用于二维数组,然后立即释放它。然而,在内存分配之前,我的进程内存使用情况是0.3MB,在分配时为259.6MB(预期值,因为将分配32768个64位int(8字节)的数组),在分配过程中为4106.8MB,但在释放内存后,内存没有降到预期的0.3MB,而是停留在12.7MB。由于我释放了所占用的所有堆内存,我期望内存回到0.3MB。
以下是我使用的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
你是如何确定内存没有被释放的?如果你使用任务管理器,你会得到一个错误的图片。如果你在调试模式下运行,是否会报告内存泄漏? - Roger Rowland
不,Roger,我在使用一个TM。谢谢。 - user2467906
1个回答

10

我确定这是一个重复的问题,但我仍然会回答它:

如果您正在查看任务管理器大小,则会提供进程的大小。如果没有“压力”(您的系统有大量可用内存,而且没有进程被饥饿),减少进程的虚拟内存使用量是没有意义的 - 进程随着处理数据进行分配,然后释放在一个处理周期中使用的数据,为下一个周期分配内存,然后再次释放。如果操作系统“重新获得”那些内存页,只需要将它们归还给您的进程,那将是浪费处理能力的行为(分配和取消分配页面到特定进程并不完全简单,特别是如果您无法确定这些页面最初属于谁,因为它们需要被“清除”[填充零或其他常数以确保“新所有者”不能使用内存来“钓鱼旧数据”,例如找到存储在内存中的我的密码])。

即使这些页面仍然属于该进程,但并未使用,实际的RAM可以被另一个进程使用。因此,如果这些页面已经未被释放了一段时间,那也没关系。

此外,在调试模式下,C ++运行时将在通过delete删除的所有内存中存储“此内存已被删除”。这是为了帮助识别“释放后使用”。因此,如果您的应用程序在调试模式下运行,则不要指望任何释放的内存会被永久释放。它将被重新使用。因此,如果您的代码运行三次,则不会增长到三倍大小。


谢谢Mats,这澄清了我怀疑的事情。 - user2467906

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接