malloc之后再进行free,free的内存空间一定被OS回收了吗?

 我来答
Panda旅行
2018-03-21 · TA获得超过106个赞
知道答主
回答量:180
采纳率:0%
帮助的人:5.6万
展开全部

我认为暂时不会,但是总归是会回收的。操作系统有一个滞后的内存管理机制。


对malloc函数实现调用brk和sbrk Linux,首次33页调用malloc(一页内存是4096字节,可以使用int getpagesize函数(void)的观点),以避免不必要的内存开销,当多个应用程序(每个应用程序,释放所有的资源,甚至作为一个给如果所有的自由了的话,),操作系统将保持到下一个配置,33页将物理映射,只有当进程退出时,那么,即使你分配到跨国经营的记忆,不会发生数据错误后,但不能保证其安全性。可能是新分配的内存擦除。

一.每一个malloc应用程序的内存将增加12个字节,在原来的基础上(一说16),这是用来维持一套实现数据结构的内存管理,如头指针,块长度和自由的标记。一旦修改,就会导致错误。

二.BRK和sbrk的实现是基于栈的操作。分配后,它必须被释放,但malloc来解决这个问题。它是免费的,它们的分布不会互相影响。这就是C语言必须实现这个功能的原因。

三.现代操作系统是分页管理存储器。如果你只是自由的一部分,页面的另一部分仍然在使用,它显然不会被回收。

此外,自由并不一定是标准的库函数。例如,如果您使用的是一种特殊的实现,那么您不会为高效的光分配释放该类型。

MacPaw
2023-07-25 广告
如果您是Mac电脑用户,并且希望定期清理电脑中的垃圾文件,以提高电脑速度和保持良好的运行状态,那么CleanMyMac是一个值得考虑购买的清理工具。CleanMyMac可以快速清理Mac电脑中的垃圾文件,包括系统清理、程序卸载、空间磁盘检测... 点击进入详情页
本回答由MacPaw提供
XXB3RRY
2018-03-21 · 贡献了超过154个回答
知道答主
回答量:154
采纳率:0%
帮助的人:5.1万
展开全部

我认为是会的,内存肯定也是资源的一种存在形式。如果你不回收利用,你每次都要退出去,多来几次,那你的内存直接就没了。 若是glibc,你所free掉的内存,不一定会马上被OS回收,这是合理的。试想一下,你每次free掉的内存都还给OS的话,尤其是在小字节的情况下,那么造成的情况,就是一大块的内存被你弄的千疮百孔,也就是说一块内存,里面有很多gap。而在操作系统的虚拟内存管理中,更是管理着的是固定大小的内存,如4K,那你还给我1 Byte,OS显然是很尴尬的。

为了避免这个问题,内存管理通常有一个免费的列表,删掉的那些没用的东西就在这里面了。那么你可能会释放很散乱的内存过来,没关系,我们在这里会尝试合并这些散乱的block,而malloc首先找的也是free block list,而非从OS申请新的内存。

所以如果你找到了合适的自然最好的,如果你发现了一个比你想要的更大的,那么一部分malloc,另一部分放回去。而有的同学提到了小内存的问题,而这也是free block list在头部会有一些所谓的administrative data,所以用标准的malloc和free管理小内存是不高效,因为越小越容易造成gap。

最后友情提醒每个malloc实现都不同,不要只参考了一个实现之后就认为其它malloc实现也会做一样的取舍。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式