递归删除链表,使用 new 分配内存

Recursively deleting a linked list, memory was allocated using new

本文关键字:new 分配 内存 使用 删除 链表 递归      更新时间:2023-10-16
void DeleteList(node** Head)
{
  if(*Head==NULL)
    return;
  node* current=*Head;
  delete[] current;
  current=NULL;
  DeleteList(&((*Head)->next));
}

程序崩溃并出现分段错误。

您需要先将(*Head)->next复制到另一个变量中,然后再delete[] current 。否则,您将尝试访问已删除节点中的next

void DeleteList(node** Head)
{
  if(*Head==NULL) {
    return;
  }
  node* current=*Head;
  node* tail = current->next;
  delete current;
  DeleteList(&tail);
}

另外,我怀疑您是否应该使用delete[]. current大概只是一个节点,而不是一个节点数组。而且没有必要设置current = NULL;这是一个局部变量,当函数结束时它会消失,之后你再也没有使用过它,所以它包含什么并不重要。

另一种解决方案是简单地将DeleteList(&((*Head)->next));移动到 delete current; 之前

我也不确定为什么使用指向指针的指针调用此函数。这通常在您想要修改调用方的指针时完成。但你在这里永远不会这样做。但也许您这样做是为了与链表库的其余部分保持一致,这没关系。

这里有一些想法你必须做什么。 删除后访问内存是未定义的行为(如巴马尔的评论

void deleteList(list_link* item)
{
    while (item)
    {
        list_link* old = item;
        item = item->next;
        delete old;
    }
}