malloc之后再进行free,free的内存空间一定被OS回收了吗
我认为是会的,内存肯定也是资源的一种存在形式。如果你不回收利用,你每次都要退出去,多来几次,那你的内存直接就没了。 若是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实现也会做一样的取舍。
2024-06-18 广告