You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++链表remove函数调用致程序崩溃,求问题排查与解决

链表remove函数崩溃问题排查与修复

问题根源分析

你的remove函数存在多个致命问题,直接导致程序崩溃:

  • 错误的节点比较逻辑:通过new Node<T>(item)创建新节点后,用指针地址(head == search、current != search)判断是否匹配。链表原有节点和新创建的节点内存地址完全不同,永远不会相等,要么循环遍历到空指针触发崩溃,要么误判节点不存在执行非法操作。
  • 单元素链表直接空指针访问:当链表只有一个元素时,current = current->next会让current变为NULL,后续current->next直接对空指针解引用,触发崩溃。
  • 未处理节点不存在的场景:遍历到链表末尾仍未找到目标节点时,current变为NULL,执行previous->next = current->next会再次触发空指针崩溃。
  • 内存泄漏:创建的search节点未释放,删除的节点也未用delete释放内存,造成内存泄漏。

修复后的代码

参考你retrieve函数的匹配逻辑,修正后的remove函数如下:

template <class T>
Error_code List<T>::remove(T& item)
{
    if (empty()) return underflow;

    Node<T>* current = head;
    Node<T>* previous = nullptr;

    // 按FlightNO匹配目标节点,与retrieve逻辑保持一致
    while (current != nullptr && current->entry.FlightNO.compare(item.FlightNO) != 0) {
        previous = current;
        current = current->next;
    }

    if (current == nullptr) {
        // 未找到目标节点
        return not_found;
    }

    // 处理头节点删除
    if (previous == nullptr) {
        head = head->next;
    } else {
        // 处理中间/尾节点删除
        previous->next = current->next;
    }

    // 保存被删除的元素(按需保留)
    item = current->entry;
    // 释放节点内存,避免泄漏
    delete current;

    return success;
}

修复说明

  1. 移除冗余的search节点,直接通过entry.FlightNO匹配节点,与retrieve函数逻辑统一,避免指针地址比较的错误。
  2. 先判断链表是否为空,提前返回underflow避免后续非法操作。
  3. 遍历过程中实时检查current是否为NULL,防止越界访问空指针。
  4. 区分头节点和普通节点的删除逻辑,覆盖单元素、中间节点、尾节点所有场景。
  5. 添加delete current释放内存,解决内存泄漏问题。
  6. 增加节点不存在的判断,返回not_found错误码。

内容的提问来源于stack exchange,提问作者Andriaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:20:40