繁体   English   中英

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

[英]C++ delete does not free all memory (Windows)

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

问题是:我正在为二维数组动态分配一些内存,然后立即取消分配它。 不过,在分配内存之前,我的进程内存使用情况是分配之前0.3 MB,分配时为259.6 MB(由于分配了32768个64位int(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也可以由其他进程使用。 因此,如果一段时间没有发布页面,那不是什么大不了的事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM