0

動的に割り当てられたメモリを解放する単純な関数を作成しようとしていました

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 行はデータの同じ値を返します..さらに大きなリストでこれを試しました。同じことが起こります!最後の 2,3 個の値 (つまり、head_new->data) がそのまま返されます。私の質問: これは一種のバグですか? または、そのような値を持つのは正常ですか?free の戻り値の型がないので、このことは私に関係があります。私の疑問を解消するのを手伝ってください。

4

2 に答える 2

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

Causes your program to have Undefined behavior(UB). Note that once you called free the pointer any attempt to dereference the pointer head_new causes an Undefined behavior.
An UB means your program can show any behavior, it does not have to produce a crash. SImply said dereferencing it is Invalid and should not be done.

What possibly happens behind the scenes?

free does not reinitialize the deallocated memory it merely marks it free for reusage.
So the contents at the address are still the same and derferencing the pointer gives you those contents. However, it does not matter because UB happened the moment you dereferenced the pointer.

于 2013-01-24T07:08:16.543 に答える
2

The value will be there until it is override by some other data.

The only thing happening when you do free is that the memory will be put back to the free pool so that if other one asks that one will be given.

于 2013-01-24T07:07:36.887 に答える