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

C++ 自製鏈表代碼審查:push_front 正確,clear 存在記憶體洩漏與崩潰

     編輯:程式設計綜合問答

clear() 缺陷分析

void clear() {
    node *next;
    for (node *temp = m_head; temp; temp = temp->m_next) {
        next = temp->m_next;
        delete temp;
        temp = next; // 錯誤:for 迴圈第三句仍會執行 temp = temp->m_next,導致跳過節點、訪問已釋放記憶體
    }
    m_head = nullptr;
}

正確寫法

void clear() {
    while (m_head) {
        node *next = m_head->m_next;
        delete m_head;
        m_head = next;
    }
}

或 C++11 範圍 for (需先收集指標):

void clear() {
    std::vector<node*> all;
    for (node *p = m_head; p; p = p->m_next) all.push_back(p);
    for (node *p : all) delete p;
    m_head = nullptr;
}

其他問題

  • empty() 回傳 size() (int),語意反轉:空時應回傳 true,建議 return m_head == nullptr;。
  • locate() 使用未宣告的 head (應為 m_head)。
  • 複製建構函式 List(const List&) 中 while (const_iterator it = l.begin(); ...) 語法錯誤,應為 for (auto it = l.begin(); it != l.end(); ++it)。
  • 缺少移動建構/移動賦值 (Rule of Five)。
  • 迭代器未實現 operator->() 正確回傳 T* (現回傳 node*)。

建議

教學/面試手寫容器可練習;生產代碼**直接使用 std::list 或 std::forward_list**,經過嚴格測試、零成本抽象、支援分配器、除錯器可視化。

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