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.
有人能解释一下为什么连续两次释放 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.