unlink是对双向堆链表进行操作的(largebin和smallbin),它对发生在堆合并之后
unlink
测试代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
void *a = malloc(0x10);
void *chunk1 = malloc(0x80);
void *b = malloc(0x10);
void *chunk2 = malloc(0x80);
void *chunk3 = malloc(0x80);
void *c = malloc(0x10);
void *chunk4 = malloc(0x80);
void *d = malloc(0x10);
free(chunk1);
free(chunk2);
free(chunk4);
free(chunk3);
return 0;
}
接下来,编译好之后,在free(chunk3)处打一个断点,然后执行,查看堆状态
可以看到chunk1、chunk2、chunk4已经构成了链表,如下
此时chunk2与前后构成了双向链表,但目前并没有出发unlink,那么需要执行后面的free(chunk3),让chunk2和chunk3合并,改变chunk大小后,就会触发unlink机制了。
接着执行完free(chunk3),查看堆状态
结构图如下
由此可见,chunk1、chunk3都修改了对应的指针,而chuunk2与chunk3