简介
malloc_consolidate()
函数是定义在 malloc.c 中的一个函数,用于将 fastbin 中的空闲 chunk 合并整理到 unsorted_bin 中以及进行初始化堆的工作,在 malloc()
以及 free()
中均有可能调用 malloc_consolidate()
函数。本文以 glibc 2.24 版本的 malloc_consolidate()
为讲述对象,从源代码的角度简要分析 malloc_consolidate()
函数的具体实现。注意,读懂此文需要读者对 Linux 平台的堆空间分配有基本了解,明白 bin、chunk 等基本要素的含义。
源代码
在注释里说到,malloc_consolidate() 是 free() 的一个小的变体,专门用于处理 fastbin 中的空闲 chunk。它同时还负责堆管理的初始化工作。
/*
------------------------- malloc_consolidate -------------------------
malloc_consolidate is a specialized version of free() that tears
down chunks held in fastbins. Free itself cannot be used for this
purpose since, among other things, it might place chunks back onto
fastbins. So, instead, we need to use a minor variant of the same
code.
Also, because this routine needs to be called the first time through
malloc anyway, it turns out to be the perfect place to trigger
initialization code.
*/
static void malloc_consolidate(mstate av)
{
mfastbinptr* fb; /* current fastbin being consolidated */
mfastbinptr* maxfb; /* last fastbin (for loop control) */
mchunkptr p; /* current chunk being consolidated */
mchunkptr nextp; /* next chunk to consolidate */
mchunkptr unsorted_bin; /* bin header */
mchunkptr first_unsorted; /* chunk to link to */
/* These have same use as in free() */
mchunkptr nextchunk;
INTERNAL_SIZE_T size;
INTERNAL_SIZE_T nextsi