malloc 空闲链表
在malloc函数背后,有着依靠空闲链表来管理内存的一套机制。当我们调用malloc函数时,它会沿着空闲链表去查找满足用户请求大小的内存块。比如说,链表上有多个不同大小的空闲内存块,它就会依次遍历这些块来找到合适的那一个。找到合适的内存块后,如果这个内存块比用户请求的大小要大,那么就会按需将其分割成两部分,一部分的大小刚好与用户请求的大小相等,这部分就会分配给用户使用,而剩下的那部分则会被放回空闲链表中,等待后续其他的内存分配请求再进行分配。例如,空闲链表中有一个 50 字节的空闲块,而用户请求分配 20 字节的内存,这时malloc就会把这个 50 字节的块分成 20 字节(分配给用户)和 30 字节(放回空闲链表)两块。而当我们使用free函数释放内存时,相应被释放的内存块又会被重新连接到空闲链上。这样,整个空闲链表就处于一个动态变化的过程,不断地有内存块被分配出去,也不断地有释放的内存块回归链表,以实现内存的循环利用,避免浪费。不过,随着程序不断地分配和释放内存,空闲链有可能会被切成很多的小内存片段,要是后续用户申请一个较大的内存片段时,空闲链上可能暂时没有可以满足要求的片段了,这时malloc函数可能就需要进行一些整理操作,比如对这些小的空闲块尝试合并等,以便能满足较大内存请求的情况。