有人可以解释一下为什么连续两次释放导致崩溃,但释放第一个,然后是b,然后又一次不会崩溃?
我知道free会将堆块插入双链接空闲列表中。释放两次会在空闲列表中两次插入相同的块。但为什么崩溃发生了?
int *a = malloc(8);
int *b = malloc(8);
free(a);
// free(a); //Would crash!
free(b);
free(a); //No crash
答案 0 :(得分:5)
因为在C lingo中,未定义的行为就是:undefined。任何事都可能发生。
另见man 3 free
:
[...]如果之前已经调用
free(ptr)
,则会发生未定义的行为。