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

C++口罩订购服务代码删除指针后出现Segmentation error(core dumped)错误

口罩配送代码段错误问题修复方案

问题根因

  • 核心问题1:deliver函数删除最旧的尾节点后,没有将前一个节点的next指针置为NULL,导致该指针变为野指针,后续output遍历链表时访问已释放的内存触发段错误。
  • 核心问题2:原deliver没有做空链表判断,若空链表调用deliver会直接访问head->next触发空指针解引用。
  • 你自行添加的代码存在语法错误:head->next == NULL是相等判断语句,没有赋值效果,应该用单等号=,且额外的head->next->next判断没有必要,递归逻辑本身可以处理所有长度的链表。

定位方法

  • 可以用GDB调试:编译时加-g参数,运行gdb 可执行文件名,执行run触发段错误后执行bt打印调用栈,直接定位到触发错误的代码行。
  • 也可以在output函数中加打印输出每个节点的指针地址,就能发现遍历到了已释放的非法内存地址。

修复方案

直接修改deliver函数即可,不需要额外增加冗余判断:

void deliver(Mask *&head){
    // 先处理空链表边界,避免空指针解引用
    if (head == NULL) {
        return;
    }
    // 找到尾节点(最旧的订单)
    if (head->next == NULL) {
        cout << "Delivering " << head->type;
        cout << " for " << head->customer << endl;
        delete head;
        // 关键:当前head是上一级节点next成员的引用,置为NULL后上一级节点的next直接变为空,避免野指针
        head = NULL;
        return;
    }
    deliver(head->next);
}

效果验证

修改后运行原测试用例,流程为:新增3个订单→打印全量订单→配送最旧的Alice订单→再次打印订单列表,只会输出Cindy和Bruce的订单,不会触发段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:45:07