首页 > 解决方案 > 为什么 free() 函数不向操作系统返回内存?

问题描述

在Linux上使用顶级终端程序时,看不到free的结果。

我的期望是:

  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");

谢谢。

标签: c++linuxredhat

解决方案


内存被分配到堆上

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

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

如果您的程序设计依赖于此内存被回收,则可以使用运行和退出的程序的多个副本(通过 fork()~ing)来实现。

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


推荐阅读