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() されると、受け取ったメモリ ポインタを引数として取り、そこからオフセットを差し引いてチャンク ポインタを取得します。その間に一連のチェックがありますが、チャンクが mmap されていない場合は、通常、別の空きチャンクと前方または後方に統合されます。free() されたチャンクはすでにビンにあるため、その特定のビン内でそれを統合するチャンクを検索するだけですよね?前方統合の場合、unlink()
マクロが呼び出され、free() されたチャンクに続くチャンクに適用されます。次のチャンク (「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() されたチャンクに追加されるコードの部分を見逃したに違いありませんが、どこにあるのかわかりません。誰でも助けることができますか?ありがとう。