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

Posted

技术标签:

【中文标题】C++ 删除不会释放所有内存 (Windows)【英文标题】:C++ delete does not free all memory (Windows) 【发布时间】:2013-06-05 04:22:06 【问题描述】:

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

【问题讨论】:

你是如何决定内存没有被释放的?如果你使用任务管理器,你会得到一个错误的图片。如果在调试中运行,是否会报告内存泄漏? 不,罗杰,我使用的是 TM。谢谢。 【参考方案1】:

我确定这是重复的,但我还是会回答:

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

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

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

【讨论】:

谢谢你 Mats,这澄清了我的怀疑。

以上是关于C++ 删除不会释放所有内存 (Windows)的主要内容,如果未能解决你的问题,请参考以下文章

使用颜色条删除图像不会释放 matplotlib 中的内存?

在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)

Windows COM C++ - 使用删除或释放

在 C++ 中删除其类的实例后,分配给 cpp 中定义的全局静态变量的内存是不是被释放?

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

释放与 C++ 中的结构关联的所有内存