为什么 free() 函数不将内存返回给操作系统?
Why does the free() function not return memory to the operating system?
当我在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("endendn");
谢谢。
内存被分配到一个堆上。
当您在程序中请求一些内存时(使用 new(( 或 malloc(( 等(程序从其堆中请求一些内存,而堆又从操作系统{1}请求内存。 由于这是一项昂贵的操作,因此它从操作系统中获取了一大块内存,而不仅仅是您要求的内存。 内存管理器将它得到的所有内容放入堆中,只是将您要求的可能很少的量返回给您。 当你释放((或删除((这个内存时,它只是被返回到堆,而不是操作系统。
在程序退出之前,该内存不返回到操作系统是绝对正常的,因为稍后可能会请求更多内存。
如果您的程序设计依赖于此内存回收,则可以使用运行和退出的程序的多个副本(通过 fork((~ing(来实现。
{1} 在程序启动时,堆可能是非空的,但假设它不能说明我的观点。
堆通常使用操作系统函数来管理其内存。堆的 创建程序时,大小可以是固定的,也可以允许它增长。然而 在以下情况下,堆管理器不一定将内存返回给操作系统 调用 free 函数。释放的内存只是供应用程序后续使用。因此,当程序分配然后释放内存时,内存的释放通常不会反映在应用程序的内存中。 从操作系统角度看的使用情况。
相关文章:
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 共享内存:MapViewOfFile 返回错误 5
- 将内存分配返回值强制转换为 TYPE 数组
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 为什么 free() 函数不将内存返回给操作系统?
- 从函数返回时C++内存管理
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 函数,返回变量c++占用的内存位置的大小
- 指针地址的内存偶尔更改了函数前和后返回
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 返回内存异常错误的矢量
- 数组中的值之和返回内存地址,除非sizeof(array)/2
- 返回内存映射文件后,数据将丢失
- 使用指针数组中的对象调用重载的友元 ostream 插入运算符将返回内存地址
- C++返回内存地址而不是值
- Std::getline()使用cout时返回内存地址
- 在c++程序结束时返回内存
- 删除返回内存问题
- 一旦 cudaMalloc 返回内存不足,每个 cuda API 调用都会返回失败