2

リンクされたリストのヘッド ノードを解放すると、他のノードがまだメモリ内にある状態でヘッド ノードが削除されるか、リスト全体が解放され、どのように解放されますか?

4

4 に答える 4

5

リンクされたリストは次のようになります。

head
+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |                                
                         null  

headノードは最初のノードのアドレスのみを保持しますfree(head)。そうすると、最初のノードのメモリが値1 のみで解放され、他のノードはまだメモリ内にあり、それらにアクセスするのに有効ですが、2リンクされたノードにアクセスするには、最初にノードのアドレスを保存する必要がありますリスト (そうしないと、コードでメモリ リークが発生する可能性があります)。

好きなこと:

   new_head = head->next;
   free(head);

メモリを解放/解放すると、未定義の動作でメモリにアクセスできなくなります (アドレスが無効になります)。

コメントから:

  1. はい、リンクされたリスト内のすべてのノードのメモリを解放するためのループが必要です。次のようにします。

     while(head){          // while head not null
         new_head = head->next;   // first save address of next
         free(head);           // free first node
         head = new_head;      // set head to next node, not yet free
     }
    
  2. コメント 2:
    プログラムで動的に割り当てられたメモリを削除/解放しない場合、プロセスが終了しないまでプロセスに割り当てられたままになります (C にはガベージ コレクターがないことを思い出してください)。動的に割り当てられたメモリは、プログラムが終了しない限り有効です。したがって、割り当てられたメモリで作業を終了した場合は、明示的に解放してください。
于 2013-07-24T05:54:13.417 に答える
1

ヘッド ノードを解放すると、ヘッド ノードに割り当てられたメモリが解放されるだけです。他のリスト ノードは保持されます。次に、リストの次のメンバーに頭を向ける必要があります。たとえば、次の単一の連結リストを考えてみましょう。

A -> B -> C -> D -> Null

ヘッド ノード A を解放し、ヘッドをノード B に移動すると、リンク リストは次のようになります。

B -> C -> D -> Null

于 2013-07-24T05:53:20.043 に答える