c++ - 为什么 free() 函数不向操作系统返回内存?
问题描述
在Linux上使用顶级终端程序时,看不到free的结果。
我的期望是:
免费地图和列表。
我可以在顶部看到的内存使用情况(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!\n");
sleep(10);
printf("endend\n");
谢谢。
解决方案
内存被分配到堆上。
当您在程序中请求一些内存时(使用 new() 或 malloc() 等),您的程序会从其堆中请求一些内存,而后者又会从操作系统中请求它{1}。由于这是一项昂贵的操作,它会从操作系统获取大量内存,而不仅仅是您要求的。内存管理器将它得到的所有东西都放入堆中,只返回给你你要求的少量。当您释放()或删除()此内存时,它只是返回到堆,而不是操作系统。
在您的程序退出之前,该内存不会返回给操作系统是绝对正常的,因为您稍后可能会请求更多的内存。
如果您的程序设计依赖于此内存被回收,则可以使用运行和退出的程序的多个副本(通过 fork()~ing)来实现。
{1} 堆在程序启动时可能不是空的,但假设它没有说明我的观点。
推荐阅读
- python-3.x - sympy 符号简化 Norm CDF PDF?
- c# - UWP TabView 重复按钮
- git - 有没有办法为 github 拉取请求列出所有更改的文件
- reactjs - 如何将 div + useStyles 从@emotion/styled 转换为样式?
- javascript - 点概念如何在数组或不同的地方工作
- java - 根据值和大小的总和在多个列表中拆分对象列表
- node.js - MongoDB - 如何为集合中的对象设置可变结构
- android - Kotlin Android 依次显示几个已定义的布局活动
- json - IDEA无法在mac中将json文件格式化为漂亮
- r - ggplot barplot:将每个单独的令牌作为自己的条形图