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; }
修复说明
- 移除冗余的
search节点,直接通过entry.FlightNO匹配节点,与retrieve函数逻辑统一,避免指针地址比较的错误。 - 先判断链表是否为空,提前返回
underflow避免后续非法操作。 - 遍历过程中实时检查
current是否为NULL,防止越界访问空指针。 - 区分头节点和普通节点的删除逻辑,覆盖单元素、中间节点、尾节点所有场景。
- 添加
delete current释放内存,解决内存泄漏问题。 - 增加节点不存在的判断,返回
not_found错误码。
内容的提问来源于stack exchange,提问作者Andriaaa
相关产品推荐
相关产品推荐

