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

C 語言鏈表銷毀函數邏輯錯誤修正:避免內存洩漏與死循環

     編輯:程式設計綜合問答

原代碼問題分析

void DestroyLinkList(LinkList L) {
    if(L==NULL) return 0;           // void 函數不能 return 0
    if(L->next!=NULL) {             // 僅處理第二個節點
        p=L;
        L=L->next;
        free(p);
    }
    free(head);                     // head 未定義
    head=NULL;                      // head 未定義
    p=NULL;
    return 0;                       // void 不能返回值
}

嚴重錯誤:

  1. 僅釋放第一個數據節點,其餘節點全部洩漏
  2. 無循環遍歷機制
  3. 使用未聲明變量 head、p
  4. void 函數非法返回值
  5. 未處理頭節點釋放邏輯

正確銷毀邏輯(帶頭節點)

void DestroyLinkList(LinkList *L) {  // 傳二級指針,可修改頭指針
    if (L == NULL || *L == NULL) return;
    
    LinkList p = *L;
    LinkList q;
    
    while (p != NULL) {
        q = p->next;  // 保存下一個
        free(p);      // 釋放當前
        p = q;        // 移動到下一個
    }
    
    *L = NULL;  // 頭指針置 NULL,防止野指針
}

調用示例

LinkList head = CreateList(); // 假設創建帶頭節點的鏈表
DestroyLinkList(&head);       // 傳頭指針地址
// head 現在為 NULL

無頭節點版本

void DestroyLinkList_NoHead(LinkList *L) {
    LinkList p = *L;
    while (p) {
        LinkList tmp = p;
        p = p->next;
        free(tmp);
    }
    *L = NULL;
}

關鍵點總結

測試驗證

// 使用 Valgrind 檢測內存洩漏
valgrind --leak-check=full ./test_program
// 輸出應顯示 "All heap blocks were freed -- no leaks are possible"

總結

鏈表銷毀必須完整遍歷釋放每個節點,使用二級指針修改頭指針,確保無內存洩漏、無野指針。原代碼邏輯嚴重缺失,已給出標準修正版本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
要點正確做法
遍歷釋放while(p) { q=p->next; free(p); p=q; }
修改頭指針傳 LinkList* (二級指針),結束置 NULL
變量聲明所有指針變量使用前聲明
返回類型void 不返回值
頭節點處理帶頭節點:頭節點也需 free;無頭節點:直接從第一個數據節點 free