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

