C++动态链表销毁函数异常:销毁后主函数指针值变更
动态链表销毁后指针未置空的问题分析与解决
在实现动态链表的清空与销毁功能时,会遇到这样的问题:Destroy函数内销毁链表后将指针置空,但返回main函数后原指针仍保留旧值——调试显示Destroy函数结束时list为0x0,但main中的该指针却还是原来的地址。这并不是C++无法实现这类功能,而是指针传递方式的问题。
你的代码
#include <iostream> struct Node { int val; Node* next; }; struct LinkedList { int count; Node* head; Node* tail; }; void Clear(LinkedList* list) { Node* node = list->head; Node* next = nullptr; while (node != nullptr) { next = node->next; delete node; node = next; } list->head = nullptr; list->tail = nullptr; list->count = 0; } void Destroy (LinkedList* list) { Clear(list); delete list; list = nullptr; std::cout << "\n(should be) Destroyed"; } int main() { //creating a list element Node* node = new Node; node->val = 'a'; node->next = nullptr; //inserting the element onto list LinkedList* list = new LinkedList; list->count = 0; list->head = node; list->tail = node; std::cout << "\nList: " << list; Destroy(list); std::cout << "\nList: " << list; std::cout << "\nEND"; }
问题根源
Destroy函数的参数LinkedList* list是值传递——函数内部的list只是main中list指针的一个副本。当你在Destroy里执行list = nullptr时,修改的只是这个副本的地址,完全不会影响main函数里的原指针。原指针仍然保存着被delete的LinkedList对象的旧地址(这是一个野指针)。
解决方法
要让Destroy函数能修改main中的原指针,需要使用指针的引用作为参数:
修改Destroy函数的参数为LinkedList*& list(引用传递),这样函数内部操作的就是main中的原指针:
void Destroy (LinkedList*& list) { Clear(list); delete list; list = nullptr; // 此时修改的是main中的原指针 std::cout << "\n(should be) Destroyed"; }
修改后,main函数中调用Destroy(list),执行完毕后list会被置为nullptr,输出的地址就会是0x0,符合预期。
另外,你的Clear函数是正确的——它操作的是指针指向的LinkedList结构体内部的成员(head、tail、count),不需要修改指针本身,所以值传递完全没问题。
内容的提问来源于stack exchange,提问作者propelledaviator
相关产品推荐
相关产品推荐

