有人可以解释一下为什么连续两次释放a
会导致崩溃,但首先释放a
,然后b
,然后a
再次不会崩溃吗?
我知道空闲会将堆 block 插入双链接空闲列表中。释放两次会在空闲列表中插入相同的 block 两次。但为什么会发生崩溃呢?
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.
关于linux - 双重免费 - 崩溃或不崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682186/