为什么free()函数不会将内存返回给操作系统?

Suk*_*oon 0 c++ linux redhat

当我在Linux上使用顶级终端程序时,我看不到免费的结果.

我的期望是:

  1. 免费地图和清单.

  2. 我可以在顶部看到的内存使用情况(Linux函数)或者/proc/meminfo 比过去更小.

  3. 睡觉就是开始.

  4. 程序退出.

但是,当程序结束时,内存的使用量会变小.

你会解释自由功能的逻辑吗?

以下是我的代码.

for(mapIter = bufMap->begin(); mapIter != bufMap -> end();mapIter++)
{
    list<buff> *buffList = mapIter->second;
    list<buff>::iterator listIter;
    for(listIter = buffList->begin(); listIter != buffList->end();listIter++)
    {
        free(listIter->argu1);
        free(listIter->argu2);
        free(listIter->argu3);
    }
    delete buffList;
}
delete bufMap;

printf("Free Complete!\n");

sleep(10);
printf("endend\n");
Run Code Online (Sandbox Code Playgroud)

谢谢.

Kin*_*ley 8

内存分配到堆上.

当您在程序中请求一些内存时(使用new()或malloc()等).您的程序从其堆中请求一些内存,而这些内存又从操作系统{1}请求它.由于这是一项昂贵的操作,因此从操作系统中获取大量内存,而不仅仅是您要求的内存.内存管理器将所有内容放入堆中,只需向您返回您要求的少量内容.当你释放()或删除()这个内存时,它只会返回堆,而不是操作系统.

在您的程序退出之前,该内存不会返回到操作系统是绝对正常的,因为您可能会在以后请求更多内存.

如果您的程序设计依赖于这个内存被回收,那么可以使用程序的多个副本(通过fork()〜ing)来运行和退出.

{1}在程序启动时堆可能是非空的,但假设它没有说明我的观点.