// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c/* Take a chunk off a bin list. */staticvoidunlink_chunk (mstate av, mchunkptr p){if (chunksize (p)!=prev_size (next_chunk (p)))malloc_printerr ("corrupted size vs. prev_size");mchunkptr fd =p->fd;mchunkptr bk =p->bk;if (__builtin_expect (fd->bk != p ||bk->fd != p,0))malloc_printerr ("corrupted double-linked list");fd->bk = bk;bk->fd = fd;if (!in_smallbin_range (chunksize_nomask (p))&&p->fd_nextsize !=NULL){if (p->fd_nextsize->bk_nextsize != p||p->bk_nextsize->fd_nextsize != p)malloc_printerr ("corrupted double-linked list (not small)");// Added: If the FD is not in the nextsize listif (fd->fd_nextsize ==NULL){if (p->fd_nextsize == p)fd->fd_nextsize =fd->bk_nextsize = fd;else// Link the nexsize list in when removing the new chunk{fd->fd_nextsize =p->fd_nextsize;fd->bk_nextsize =p->bk_nextsize;p->fd_nextsize->bk_nextsize = fd;p->bk_nextsize->fd_nextsize = fd;}}else{p->fd_nextsize->bk_nextsize =p->bk_nextsize;p->bk_nextsize->fd_nextsize =p->fd_nextsize;}}}
图解说明
查看这个关于unlink过程的精彩图解:
安全检查
检查指定块的大小是否与下一个块中指示的prev_size相同
还要检查P->fd->bk == P和P->bk->fw == P
如果块不是小块,则检查P->fd_nextsize->bk_nextsize == P和P->bk_nextsize->fd_nextsize == P