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
相关产品推荐
相关产品推荐

