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

时间:2018-09-20 03:50:55

标签: 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");

谢谢。

2 个答案:

答案 0 :(得分:8)

内存已分配到heap上。

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

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

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

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

答案 1 :(得分:1)

堆通常使用操作系统功能来管理其内存。堆的 程序创建时,大小可能是固定的,或者可能会增加。然而, 堆管理器不一定会在以下情况下将内存返回给操作系统 自由函数被调用。释放的内存仅可供应用程序随后使用。因此,当程序分配并释放内存时,内存的重新分配通常不会反映在应用程序的内存中 从操作系统的角度来看使用率。