应用free()后节点的值?

时间:2013-01-24 07:05:49

标签: c free output

我试图编写一个简单的函数来释放动态分配的内存

typedef struct list{
   int data;
   struct list * link;
} list;

list * head = NULL;
void release(list * head_new){
   list * dummy = NULL;
   while(head_new != NULL){
     dummy = head_new->link;
     printf("before freeing %p, %d", head_new->link, head_new->data);
     free(head_new);
     printf("free returns %p, %d", head_new->link, head_new->data);
     head_new = dummy
   }  
}

使用主函数值被赋予列表,并且即使在释放head_new节点之后,在此特定函数中也会打印一些值

1
12
1
123
1 12 1 123 before freeing 00622A40, 1
free returns 006200C4, 6433408
before freeing 00622A60, 12
free returns 006200C4, 6434048
before freeing 00622A70, 1
free returns 006200C4, 6433344
before freeing 00000000, 123
free returns 00000000, 123

如果你注意到..最后两行返回相同的数据值.. 即使我用更大的名单尝试这个。同样的事情发生了!最后的2,3个值(即head_new->数据)按原样返回。     我的问题:这是一种错误吗?或者拥有这样的价值观是正常的吗?     这件事关心我,因为没有返回类型的免费,那么它如何显示相同的价值?     请帮我清除疑虑。

2 个答案:

答案 0 :(得分:6)

free(head_new);
printf("free returns %p, %d", head_new->link, head_new->data);

使您的程序具有未定义行为(UB)。 请注意,一旦您调用指针free,任何取消引用指针head_new的尝试都会导致未定义的行为。
UB意味着您的程序可以显示任何行为,它不必产生崩溃。简单地说,取消引用它是无效的,不应该这样做。

  

幕后可能发生什么?

free没有重新初始化已取消分配的内存,它只是标记它可以重复使用。
因此地址中的内容仍然相同,并且引用指针会为您提供这些内容。但是,这并不重要,因为UB发生在您取消引用指针的那一刻。

答案 1 :(得分:2)

该值将存在,直到被其他一些数据覆盖。

当你获得自由时唯一发生的事情就是内存将被放回到空闲池中,以便在其他人请求给出一个内存时。