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

链表remove函数运行正常但程序结束触发segmentation fault问题求助

问题原因分析
  • 错误1:listLength 递减逻辑完全错误
    现有代码每执行一次循环就会调用一次listLength--,不管是否真的删除了节点。如果链表长度为N,遍历一次后listLength会直接变成原始长度 - N,远小于实际节点数量。后续所有依赖listLength的逻辑(比如链表遍历、析构函数释放节点等)都会出现越界访问,是程序结束时报段错误的核心诱因之一。只有当节点实际被删除时,才需要执行listLength--。

  • 错误2:删除节点后野指针访问
    当匹配到的节点是头/尾节点时,你调用了removeFromHead()/removeFromTail(),这两个函数已经完成了节点释放操作,此时currentPtr指向的是已经被释放的内存(野指针)。后续执行forward()操作时会访问野指针的next属性,属于非法内存访问,虽然运行时可能暂时没有触发崩溃,但已经破坏了内存结构,等到程序结束析构链表时就会触发段错误。

  • 错误3:删除节点后遍历逻辑异常
    匹配到非头尾节点删除后,你直接把currentPtr重置为头节点重新遍历,不仅效率极低,而且如果存在多个匹配节点时很容易出现重复遍历、漏遍历的问题;同时删除节点后没有跳过forward()步骤,会导致指针偏移错误。

额外提示:需要确认removeFromHead()和removeFromTail()内部是否已经执行了listLength--,如果已经执行,需要删掉修复代码中公共的listLength--语句,避免重复递减导致长度错误。

修复参考代码
void LinkedList::remove(string license){
  moveToHead();
  while(currentPtr != NULL){
    if(getCurrent().get_licence() == license){
      Node* temp = currentPtr;
      if(currentPtr == headPtr){
        removeFromHead();
        currentPtr = headPtr;
      }else if(currentPtr == tailPtr){
        removeFromTail();
        currentPtr = NULL;
      }else{
        currentPtr->getNext()->setPrev(currentPtr->getPrev());
        currentPtr->getPrev()->setNext(currentPtr->getNext());
        currentPtr = currentPtr->getNext();
        delete temp;
      }
      // 若removeFromHead/removeFromTail内部已减长度,删掉下面这行即可
      listLength--;
    }else{
      forward();
    }
  }
  moveToHead();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:57:03