C - free()之后会发生什么?

时间:2013-09-02 23:36:38

标签: c pointers struct

我有这个我malloc的结构类型,在我释放之后,指针仍指向我指定的数据。这只是因为指针指向可以释放但尚未重新分配的内存吗?

#include <stdio.h>

typedef struct Katze {
    int value;
} Katze;

int main () {
    Katze *mew = malloc(sizeof(Katze));
    mew->value = 8910;
    free(mew);
    printf("mew: %i\n", mew->value); // why does this still say "mew: 8910"?
}

3 个答案:

答案 0 :(得分:12)

释放的记忆不再属于你了。但这并不意味着它会以任何方式消失或改变。为什么你的程序会烦恼?这将浪费时间。它可能只是将内存标记为可供后续malloc()使用,就是这样。或者它可能不会。使用不属于您的内存可能会执行任何操作:返回错误的值,崩溃,返回正确的值或运行飞行模拟器游戏。这不是你的;不要搞乱它,你永远不必担心它会做什么。

答案 1 :(得分:3)

free()只是向语言实现或操作系统声明不再需要内存。当它被写入时未定义行为。

答案 2 :(得分:3)

C标准定义了free函数的行为:

  

免费功能会导致 ptr 指向的空间为   取消分配,即可供进一步分配。

这意味着稍后调用malloc(或其他内容)可能会重复使用相同的内存空间。

只要指针传递给free(),它指向的对象就会到达其生命周期的末尾。任何引用指向对象的尝试都有未定义的行为(即,您不再允许取消引用指针)。

更重要的是,指针本身的值变为 indeterminate ,因此任何引用指针值的尝试都有未定义的行为。参考:N1570 6.2.4p2:

  

如果一个对象在其生命周期之外被引用,那么行为就是   未定义。当指针的值变为不确定时   它指向(或刚刚过去)的对象到达其生命周期的末尾。

free()的参数确实是通过值传递的(就像所有C函数参数一样),因此free实际上不能修改指针。考虑它的一种方法是指针在调用之前和之后具有“相同”值,但该值在调用之前有效并且在调用之后不确定。

尝试引用指针值,甚至取消引用它,可能出现到“工作”。这是未定义行为的许多可能症状之一(可以说是最糟糕的,因为它使得检测和诊断错误变得困难)。