【问题标题】:Code runs perfectly but ends with a segmentation fault after running代码运行完美,但运行后以分段错误结束
【发布时间】:2023-04-20 13:18:02
【问题描述】:

我已经确定我从链表中删除节点的删除函数是问题所在,但我不明白为什么。

void LinkedList::remove(string license){
  moveToHead();
  while(currentPtr != NULL){
    if(getCurrent().get_licence() == license){
      if(currentPtr == headPtr){
        removeFromHead();
      }else if(currentPtr == tailPtr){
        removeFromTail();
      }else{
        currentPtr->getNext()->setPrev(currentPtr->getPrev());
        currentPtr->getPrev()->setNext(currentPtr->getNext());
        delete currentPtr;
        currentPtr = headPtr;
      }
    }
    forward();
    listLength--;
  }
  moveToHead();
}

moveToHead() 将我当前的指针移动到 head 并且 forward() 将它移动到列表中的下一项。

代码运行没有问题,但是在它完成运行后我得到一个segmentation fault (core dumped),而不是在使用remove() 时崩溃

【问题讨论】:

  • 你试过调试器吗?
  • 代码运行没有问题 -- 我的车启动并行驶,但无法停止。
  • 请发帖minimal reproducible example。您损坏了内存,但直到您的程序最终崩溃时您才意识到这一点。类似于那辆车启动、行驶,当你试图停下来时,一切都最终崩溃了。
  • 你的代码有一些设计缺陷,我建议你重新发明你的代码。特别是不要将指针用作while循环的控制工具。最好使用case 而不是if...else,并确保始终使用“安全”default 条件。

标签: c++ c++98


【解决方案1】:

仅看逻辑,即使if(getCurrent().get_licence() == license){ 为真,您仍在调用forward();listLength--;?如果找到并删除了正确的license,您不应该返回吗?

【讨论】:

    【解决方案2】:

    使用

    g++ -fsanitize=address main.cpp
    

    或相关的变体来编译您的代码然后运行它。这将告诉您如何滥用内存来导致段错误。

    【讨论】:

      最近更新 更多