7

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

#include <stdio.h>

struct S {
    int value;
}

int main () {
    S *s = malloc(sizeof(struct S));
    s->value = 8910;
    free(s);
    printf("s: %i\n", s->value);
}
4

3 回答 3

18

释放的内存不再属于你。但这并不意味着它会以任何方式消失或改变。为什么你的程序会打扰?这将是浪费时间。它可能只是将内存标记为可供后续malloc()s 使用,仅此而已。或者它可能不会。使用不属于您的内存可能会做任何事情:返回错误值、崩溃、返回正确值或运行飞行模拟器游戏。这不是你的;不要惹它,你永远不必担心它会做什么。

于 2013-09-02T23:41:39.960 回答
4

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

free函数会导致ptr指向的空间被释放,也就是说,可用于进一步分配。

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

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

不仅如此,指针本身的值变得不确定,因此任何引用指针值的尝试都有未定义的行为。参考:N1570 6.2.4p2:

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

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

尝试引用指针值,甚至取消引用它,很可能看起来“有效”。这是未定义行为的许多可能症状之一(可以说是最糟糕的,因为它很难检测和诊断错误)。

于 2013-09-02T23:53:56.807 回答
2

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

于 2013-09-02T23:41:59.433 回答