为什么 free() 函数不将内存返回给操作系统?
- 2024-10-21 09:14:00
- admin 原创
- 74
问题描述:
当我在Linux上使用顶级终端程序时,我看不到免费的结果。
我的期望是:
免费地图和列表。
我可以在顶部看到内存使用情况(Linux 功能)
/proc/meminfo
比过去更小。睡眠开始了。
程序退出。
但只有当程序结束时内存的使用量才会变小。
你能解释一下自由函数的逻辑吗?
下面是我的代码。
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!
");
sleep(10);
printf("endend
");
感谢您。
解决方案 1:
内存被分配到堆上。
当您在程序中请求一些内存时(使用 new() 或 malloc() 等),程序会从其堆中请求一些内存,而堆又会从操作系统中请求这些内存{1}。由于这是一个昂贵的操作,它会从操作系统中获取一大块内存,而不仅仅是您请求的内存。内存管理器会将其获取的所有内容放入堆中,只返回您请求的可能很少的内存。当您 free() 或 delete() 此内存时,它只会返回到堆中,而不是操作系统。
在程序退出之前该内存不会返回给操作系统是绝对正常的,因为您稍后可能会请求更多内存。
如果您的程序设计依赖于此内存的回收,则可能可以使用程序的多个副本(通过 fork()~ing)来运行并退出。
{1} 程序启动时堆可能不为空,但假设它不为空可以说明我的观点。
解决方案 2:
堆通常使用操作系统函数来管理其内存。堆的大小可能在程序创建时就已固定,也可能允许其增长。但是,当调用 free 函数时,堆管理器不一定将内存返回给操作系统。释放的内存只是供应用程序后续使用。因此,当程序分配然后释放内存时,从操作系统的角度来看,内存的释放通常不会反映在应用程序的内存使用量中。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD