6

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

1 回答 1

10

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

如果您正在查看任务管理器大小,它将为您提供进程的大小。如果没有“压力”(您的系统有足够的可用内存,并且没有进程处于饥饿状态),那么减少进程的虚拟内存使用量是没有意义的——进程增长、缩小、增长并不罕见,以循环模式收缩,因为它在处理数据时进行分配,然后释放在一个处理周期中使用的数据,为下一个周期分配内存,然后再次释放它。如果操作系统要“重新获得”这些内存页面,只需要再次将它们归还给您的进程,那将浪费处理能力(将页面分配和取消分配给特定进程并非完全微不足道,尤其是如果你无法确定这些页面最初属于谁,

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

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

于 2013-06-09T09:37:15.473 回答