設定
C
1/* 自己参照構造体 */ 2typedef struct list{ 3 char name[256]; 4 struct list *next; 5} LIST;
を用意して、malloc
でメモリを動的確保した際、プログラム終了時のfree
に関して質問です。
質問1
main関数の最後に、
C
1/* メモリの解放 */ 2 p = head; 3 while(p != NULL){ 4 q = p->next; // 次のノードアドレスを保存 5 free(p->name); 6 free(p->next); 7 free(p); 8 p = q; 9 }
とすることで、リストに残っているノードのメモリを解放できているでしょうか?
質問2
自作関数で、単方向リストの特定のノードの削除を行う場合、ノードのつなぎ替えのみではメモリ解放は当然できていないと思いますが、削除する対象のノードはfree
した方が良いでしょうか?
実際に以下のプログラムでfree
するとエラーが出ます(コンパイルは通ります)。
※以下のプログラムを含む関数を通った際にエラーが出ます。
C
1// 削除対象のノードをpとする 2free(p->name); 3free(p->next); 4free(p);
問題点などを教えてください。
####追記:
C
1free(p);
Cの場合にはエラーは出ませんでしたが、
C
1free(p->name); 2free(p);
だと、
free(): double free detected in tcache 2 Aborted (core dumped)
とエラーが出ます。
回答2件
あなたの回答
tips
プレビュー