heap布局

  • 使用中和free区域混杂在一起
  • 各个block被称为chunk
  • 想要再次使用free状态的区域
  • 需要知道哪里有free的区域,因此它是链表结构
    • 实际上没这么简单

malloc获得的是这个地址

size按照8的倍数进行padding

为简单起见,图中省略了fd_nextsize和bk_nextsize

实际上的结构体:

1
2
3
4
5
6
7
8
9
struct malloc_chunk {
INTERNAL_SIZE_T mchunk_prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T mchunk_size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};

来源:https://code.woboq.org/userspace/glibc/malloc/malloc.c.html#malloc_chunk

填充

仅在前一个chunk已经free时才能访问

末尾3个字节有特定的用途

  • 最低一位(PREV_INUSE) 前一个chunk是否已被使用
  • 低二位(IS_MMAPED) 是否是mmap获取的地址(大的内存通过mmap获取)
  • 低三位(IS_NON_MAINARENA) 是否来自main_arena(多线程时,使用多个arena进行heap管理)