为什么 free() 函数不 return 操作系统内存?
Why does the free() function not return memory to the operating system?
当我在Linux使用top终端程序时,看不到free的结果。
我的期望是:
免费地图和列表。
我可以在顶部看到的内存使用情况(Linux函数)或/proc/meminfo
变得比过去更小。
睡眠开始。
程序退出。
但是
程序结束时内存占用只会变小
能解释一下free函数的逻辑吗?
下面是我的代码。
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");
谢谢。
内存分配到 heap。
当您在程序中请求一些内存时(使用 new() 或 malloc() 等)您的程序从其堆中请求一些内存,而堆又从操作系统中请求它{1}。由于这是一个昂贵的操作,它从 OS 中获取了一大块内存,而不仅仅是你所要求的。内存管理器将它得到的所有东西都放入堆中,只返回给你你要求的可能很少的数量。当您 free() 或 delete() 此内存时,它只是返回到堆中,而不是 OS.
在您的程序退出之前,内存不会返回给操作系统是绝对正常的,因为您稍后可能会请求更多内存。
如果您的程序设计依赖于回收此内存,则可以使用您的程序的多个副本(通过 fork()~ing)运行 并退出。
{1} 堆在程序启动时可能是非空的,但假设它不是说明我的观点。
堆通常使用操作系统函数来管理其内存。堆的
大小可能在创建程序时固定,也可能允许增长。然而,
堆管理器不一定 return 内存给操作系统时
自由函数被调用。释放的内存仅供应用程序后续使用。因此,当程序分配然后释放内存时,内存的释放通常不会反映在应用程序的内存中
从操作系统的角度来看的用法。
当我在Linux使用top终端程序时,看不到free的结果。
我的期望是:
免费地图和列表。
我可以在顶部看到的内存使用情况(Linux函数)或
/proc/meminfo
变得比过去更小。睡眠开始。
程序退出。
但是 程序结束时内存占用只会变小
能解释一下free函数的逻辑吗?
下面是我的代码。
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");
谢谢。
内存分配到 heap。
当您在程序中请求一些内存时(使用 new() 或 malloc() 等)您的程序从其堆中请求一些内存,而堆又从操作系统中请求它{1}。由于这是一个昂贵的操作,它从 OS 中获取了一大块内存,而不仅仅是你所要求的。内存管理器将它得到的所有东西都放入堆中,只返回给你你要求的可能很少的数量。当您 free() 或 delete() 此内存时,它只是返回到堆中,而不是 OS.
在您的程序退出之前,内存不会返回给操作系统是绝对正常的,因为您稍后可能会请求更多内存。
如果您的程序设计依赖于回收此内存,则可以使用您的程序的多个副本(通过 fork()~ing)运行 并退出。
{1} 堆在程序启动时可能是非空的,但假设它不是说明我的观点。
堆通常使用操作系统函数来管理其内存。堆的 大小可能在创建程序时固定,也可能允许增长。然而, 堆管理器不一定 return 内存给操作系统时 自由函数被调用。释放的内存仅供应用程序后续使用。因此,当程序分配然后释放内存时,内存的释放通常不会反映在应用程序的内存中 从操作系统的角度来看的用法。