free一般不会把内存还给系统(只会发生在一些很罕见的情况下)
第一个原因是这是在你的堆中产生很多碎片,这样在你申请完2G或者4G的虚拟内存后产生很多内存碎片。
第二个原因是操作系统一般只能处理那些固定大小或者是对齐的内存块,比如4KB,例如你申请了一个堆之后,再申请一个堆,删除前面一个堆,这样就会产生内存碎片。
free函数将会把内存块放回自己的内存块链表中,一般自由链表块会合并毗连的地址空间.自由链表块是一个内存块的循环链表,并且在每个内存块的头部存有管理数据。因为很小的内存块已经合并过了,这个时候再把很小的内存还给操作系统这是效率很低的一件事情。
新申请堆时,如果从自由链表那里取到比较大的内存,这取出一部分给调用者,另一部分还给自由链表