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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:20:22