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

Why does the free() function not return memory to the operating system?

本文关键字:返回 内存 操作系统 free 函数 为什么      更新时间:2023-10-16

当我在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("endendn");

谢谢。

内存被分配到一个堆上。

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

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

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

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

堆通常使用操作系统函数来管理其内存。堆的 创建程序时,大小可以是固定的,也可以允许它增长。然而 在以下情况下,堆管理器不一定将内存返回给操作系统 调用 free 函数。释放的内存只是供应用程序后续使用。因此,当程序分配然后释放内存时,内存的释放通常不会反映在应用程序的内存中。 从操作系统角度看的使用情况。