我有这个我 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);
}
释放的内存不再属于你。但这并不意味着它会以任何方式消失或改变。为什么你的程序会打扰?这将是浪费时间。它可能只是将内存标记为可供后续malloc()
s 使用,仅此而已。或者它可能不会。使用不属于您的内存可能会做任何事情:返回错误值、崩溃、返回正确值或运行飞行模拟器游戏。这不是你的;不要惹它,你永远不必担心它会做什么。
C 标准定义了free
函数的行为:
free函数会导致ptr指向的空间被释放,也就是说,可用于进一步分配。
这意味着稍后调用malloc
(或其他)可能会重新使用相同的内存空间。
一旦将指针传递给free()
,它指向的对象就到达其生命周期的尽头。任何引用指向对象的尝试都有未定义的行为(即,您不再被允许取消引用指针)。
不仅如此,指针本身的值变得不确定,因此任何引用指针值的尝试都有未定义的行为。参考:N1570 6.2.4p2:
如果对象在其生命周期之外被引用,则行为未定义。当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。
确实,free()
' 参数是按值传递的(就像所有 C 函数参数一样),因此free
实际上不能修改指针。一种思考方式是,指针在调用之前和之后具有“相同”的值,但该值在调用之前是有效的,在调用之后是不确定的。
尝试引用指针值,甚至取消引用它,很可能看起来“有效”。这是未定义行为的许多可能症状之一(可以说是最糟糕的,因为它很难检测和诊断错误)。
free()
只是向语言实现或操作系统声明不再需要内存。当它被覆盖时未定义行为。