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

标签 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;
}

最佳答案

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

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

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

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

关于C++ delete 不释放所有内存 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17008180/

相关文章:

c++ - 通过迭代器更改集合中的元素

C++ 程序不适用于某些输入

c++ - 堆上的内存是如何耗尽的?

memory-management - 排序真正的大数组有问题吗?

c++ - 为什么 "non-standard syntax; use ' &' to create a pointer to member"在 CTOR 中使用线程?

c++ - 将字符数组传递给使用构造函数初始化的类构造函数时防止溢出?

c++ - 使用 Windows 函数 SendMessage 导致与 MSVC 的链接错误,但与 MinGW 的链接错误

windows - WinInet::InternetSetOption(...) 始终返回 0,GetLastError() 返回 12018

c++ - 非阻塞 Websockets c++ 奇怪的延迟

c - 从变量的地址获取变量的名称?