首页 文章

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

提问于
浏览
5

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

问题是:我为二维数组动态分配一些内存并立即解除分配 . 但是,在内存分配之前,我的进程内存使用量是 0,3 MB before allocation, on allocation 259,6 MB (expected since 32768 arrays of 64 bit ints (8bytes) are allocated), 4106,8 MB during allocation, but after deallocation memory does not drop to expected 0,3 MB, but is stuck at 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;
}

1 回答

  • 9

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

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

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

    此外,在调试模式下,C运行时将"this memory has been deleted"存储在通过 delete 的所有内存中 . 这有助于识别"use after free" . 因此,如果您的应用程序在调试模式下运行,那么请't expect any freed memory to be released EVER. It will get reused tho' . 因此,如果您运行三次代码,它将不会增长到三倍 .

相关问题