首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言隊列與鏈表銷毀差異:存儲方式決定釋放策略,核心是無內存洩漏

     編輯:程式設計綜合問答

代碼對比

// 隊列銷毀:遍歷鏈表節點逐個 free
void DestroyQueue(LinkQueue *q) {
    while (q->front) {
        q->rear = q->front->next;
        free(q->front);
        q->front = q->rear;
    }
}

// 鏈表銷毀:僅 free 頭指針(錯誤示範)
void DestroyLinkList(LinkList *L) {
    free(L);  // 僅釋放頭結點,其餘節點洩漏!
}

本質區別

隊列與鏈表是邏輯結構,銷毀方式取決於物理存儲實現:

  • 若隊列用鏈式存儲(鏈隊列),銷毀必須遍歷釋放每個節點(如上代碼)
  • 若隊列用順序存儲(循環數組),銷毀僅需 free(q->base) 釋放數組
  • 鏈表銷毀必須遍歷釋放所有節點,上述 DestroyLinkList 代碼嚴重錯誤(僅釋放頭結點)

正確鏈表銷毀

void DestroyLinkList(LinkList *L) {
    Node *p = L->next;  // 假設帶頭結點
    while (p) {
        Node *tmp = p;
        p = p->next;
        free(tmp);
    }
    free(L); // 最後釋放頭結點
    *L = NULL; // 避免野指針
}

統一原則

  1. 誰分配誰釋放:每個 malloc 對應一個 free
  2. 遍歷釋放動態節點:鏈式結構必須逐節點釋放
  3. 置空指針:釋放後將指針設為 NULL 防野指針

數據結構銷毀無標準答案,只有「與分配方式匹配」的正確實現。理解底層存儲(順序/鏈式)是編寫正確銷毀函數的前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved