对于 glibc 2.15,我正在查看 malloc.c,特别是 free() 函数,并对 unlink() 宏感到困惑。根据来源,使用中的块如下所示:
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Size of previous chunk, if allocated
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Size of chunk, in bytes
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
User data starts here... .
. .
. (malloc_usable_size() bytes) .
.
nextchunk->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
一个 free() 的块看起来像这样:
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Size of previous chunk
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
`head:' Size of chunk, in bytes
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Forward pointer to next chunk in list
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Back pointer to previous chunk in list
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Unused space (may be 0 bytes long) .
. .
.
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
当使用的块是 free()'d 时,它将接收到的 mem 指针作为参数并从中减去偏移量以获得块指针。中间有一堆检查,但在没有映射块的情况下,它通常向前或向后将它与另一个空闲块合并。由于 free() 的块已经在一个 bin 中,它只是在那个特定的 bin 中搜索块来合并它,对吗?在前向合并的情况下,unlink()
宏被调用并应用于被释放()的块之后的块。我不明白这一点,因为当下一个块(称之为'nextchunk')被取消链接时,会发生以下代码:
#define unlink(P, BK, FD) {
FD = P->fd;
BK = P->bk;
.
.
.
FD->bk = BK;
BK->fd = FD;
.
.
.
}
BK->fd
考虑到 BK 指向被 free() 的块并且查看它的结构,它没有前向或后向指针,如何引用它。我一定错过了代码中将 fd 和 bk 字段添加到 free() 的块中的部分,但我不知道在哪里。任何人都可以帮忙吗?谢谢。