这是我目前的代码。
int main() {
double *t, *k;
Item *a = calloc(1, sizeof(Item));
a->w = malloc(sizeof(double));
t = a->w;
k = t;
free(a->w);
free(a);
free(k);
return 0;
}
在这个例子中,我能够编译并运行而不会出现任何明显的错误。但是,如果我释放指针k,在结构之前释放a,则会收到双重释放/堆损坏错误。
free(a->w);
free(k);
free(a);
此外,如果我这样做,我会收到同样的错误:
free(k);
free(a->w);
free(a);
为什么我可以在没有任何显式错误的情况下释放结构后释放指针k,但是我无法释放内存k指向两次直到结构a被释放?
答案 0 :(得分:4)
这是Undefined behavior的一个例子。这意味着任何事情都可能发生,例如出现工作,立即崩溃,稍后崩溃,或奇怪的意外行为,或经常提到的nasal demons。
来自man page:
free()释放ptr指向的内存空间,它必须具有 之前调用malloc(),calloc()或realloc()返回。 否则,或者如果之前已经调用了free(ptr), 发生未定义的行为。如果ptr为NULL,则不进行任何操作 进行。
因此可能会发生触发双重自由错误,但不是必需的。