释放链表的头节点

Dee*_*dav 2 c memory malloc linked-list

如果我释放链表的头节点,它只是删除头节点,其他节点仍在内存中,或者它将释放整个列表以及如何?

Gri*_*han 5

您的链接列表应该是:

head
+---+    +---+    +---+                               
| 1 |--->| 2 |--->| 3 |---+
+---+    +---+    +---+   |                                
                         null  
Run Code Online (Sandbox Code Playgroud)

head节点只保留第一个节点的地址,如果这样做free(head),那么它将释放第一个节点的内存1 只有值而其他节点仍然在内存中并且它有效访问它们,但是你应该首先保存节点的地址2,以便访问链接list(否则你的代码中会出现内存泄漏).

喜欢:

   new_head = head->next;
   free(head);
Run Code Online (Sandbox Code Playgroud)

一旦你释放/ free()一个内存,它的未定义行为就不能访问(地址变得无效).

来自评论:

  1. 是的,你需要为链表中的所有节点提供一个循环到free()内存,做这样的事情:

     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
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. comment-2:
    如果你没有在你的程序中删除/释放动态分配的内存,那么它将保持分配给你的进程,直到它没有终止(记住在C中我们没有垃圾收集器).动态分配的内存具有生命,直到您的程序不会终止.因此,如果您已完成分配内存的工作,请明确释放它.