为什么我可以两次释放内存,但不能在不同的情况下?

时间:2016-04-21 01:55:41

标签: c pointers memory free

这是我目前的代码。

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被释放?

1 个答案:

答案 0 :(得分:4)

这是Undefined behavior的一个例子。这意味着任何事情都可能发生,例如出现工作,立即崩溃,稍后崩溃,或奇怪的意外行为,或经常提到的nasal demons

来自man page

  

free()释放ptr指向的内存空间,它必须具有   之前调用malloc(),calloc()或realloc()返回。   否则,或者如果之前已经调用了free(ptr),   发生未定义的行为。如果ptr为NULL,则不进行任何操作   进行。

因此可能会发生触发双重自由错误,但不是必需的。