Double Free - 崩溃或不崩溃

Double Free - crash or no crash

有人能解释一下为什么连续两次释放 a 会导致崩溃,但是先释放 a,然后释放 b,然后再释放 a 不会崩溃?

我知道 free 会将堆块插入双链接的空闲列表中。释放两次会在空闲列表中插入相同的块两次。但是为什么会发生崩溃?

int *a = malloc(8);
int *b = malloc(8);

free(a);

// free(a); // Would crash!

free(b);

free(a); // No crash.

因为在 C 语言中,未定义的行为 就是:未定义。什么事都有可能发生。

另见 man 3 free:

[…] if free(ptr) has already been called before, undefined behavior occurs.