C++ C++;删除不会释放所有内存(Windows)

C++ C++;删除不会释放所有内存(Windows),c++,visual-c++,memory-management,memory-leaks,heap-memory,C++,Visual C++,Memory Management,Memory Leaks,Heap Memory,我需要帮助了解Windows上内存分配和释放的问题。我正在使用VS11编译器(VS2012 IDE)和目前最新的更新(更新3 RC) 问题是:我正在为一个二维数组动态分配一些内存,并立即释放它。不过,在分配内存之前,我的进程内存使用量在分配之前为0,3 MB,在分配时为259,6 MB(由于分配了32768个64位整数(8字节)的数组,因此预计为416,8 MB),在分配期间为4106,8 MB,但在解除分配之后,内存不会下降到预期的0,3 MB,而是停留在12,7 MB。因为我正在释放所有占用

我需要帮助了解Windows上内存分配和释放的问题。我正在使用VS11编译器(VS2012 IDE)和目前最新的更新(更新3 RC)

问题是:我正在为一个二维数组动态分配一些内存,并立即释放它。不过,在分配内存之前,我的进程内存使用量在分配之前为0,3 MB,在分配时为259,6 MB(由于分配了32768个64位整数(8字节)的数组,因此预计为416,8 MB),在分配期间为4106,8 MB,但在解除分配之后,内存不会下降到预期的0,3 MB,而是停留在12,7 MB。因为我正在释放所有占用的堆内存,所以我希望内存回到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;
}
#包括
#定义大小32768
int main(int argc,char*argv[]){
std::getchar();
int**p_p_dynamic2d=新int*[SIZE];

对于(int i=0;i我肯定这是重复的,但我还是会回答:

如果您正在查看任务管理器大小,它将为您提供进程的大小。如果没有“压力”(您的系统有足够的可用内存,并且没有进程被耗尽),减少进程的虚拟内存使用是没有意义的-进程在处理数据时分配数据,然后释放在一个处理周期中使用的数据,为下一个处理周期分配内存,然后再次释放内存。如果操作系统要“重新获得”这些内存页只需要再次返回给进程,这将是对处理能力的浪费(为特定进程分配和取消分配页并不完全是小事,特别是如果您无法确定这些页首先属于谁,因为它们需要“清理”[填入零或其他常数,以确保“新所有者”无法使用内存“查找旧数据”,例如查找存储在内存中的我的密码])

即使这些页面仍然属于这个进程的所有权,但没有被使用,实际的RAM也可以被另一个进程使用。因此,如果这些页面已经有一段时间没有被释放,这并不是什么大问题


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

您如何确定内存未被释放?如果使用任务管理器,您将得到错误信息。如果您在调试模式下运行,请执行以下操作:你收到内存泄漏报告了吗?不,罗杰,我用的是TM。谢谢。太谢谢你了,Mats,这澄清了我的怀疑。