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

C++中链表作为参数传入deleteList后未正确删除的问题

问题分析与解决

你遇到的问题核心是C++指针的传值调用特性:deleteList函数接收的是指针的副本,函数内部修改的只是这个副本,main函数里的myList原指针完全不受影响,依然指向已经被delete释放的内存(野指针),所以后续调用LengthOfList时,遍历野指针会触发非法内存访问异常。

问题根源拆解

List是struct CodeNode*的别名,当你调用deleteList(myList)时,实际上是把myList的值(也就是第一个节点的内存地址)复制给了函数的head参数。在deleteList内部,你把head逐步置空并释放所有节点,但这个操作只作用于函数内部的head副本,main里的myList还是原来的地址,只是这个地址对应的内存已经被释放了,变成了无效的野指针。

解决方案(无需修改deleteList签名)

既然不能修改deleteList的函数签名,最直接的解决方式就是在调用deleteList之后,手动将myList置为nullptr:

修改main函数中的代码:

cout << "Before " << LengthOfList(myList);
deleteList(myList);
myList = nullptr; // 手动置空原指针
cout << "After " << LengthOfList(myList); // 此时LengthOfList会返回0,不会触发异常

补充说明(如果允许修改签名的最优方案)

如果可以修改deleteList的签名,最优做法是把参数改成指针的引用,这样函数内部就能直接修改外部的指针变量:

void deleteList(List& head) // 这里用引用
{
    List prev = head;
    while (head)
    {
        head = head->next;
        delete(prev);
        prev = head;
    }
}

但因为你明确说明不能修改签名,所以这个方案仅作参考。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:36