void DeleteList(node** Head)
{
if(*Head==NULL)
return;
node* current=*Head;
delete[] current;
current=NULL;
DeleteList(&((*Head)->next));
}
程序因分段错误而崩溃。
答案 0 :(得分:3)
您需要在(*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;
之前。
我也不确定为什么要使用指针指针调用此函数。当您想要修改调用者的指针时,通常会这样做。但你从来没有这样做过。但也许你是为了与链接列表库的其余部分保持一致而做到这一点,那很好。
答案 1 :(得分:1)
以下是您必须要做的事情。删除后访问内存是未定义的行为( as Barmar' )
void deleteList(list_link* item)
{
while (item)
{
list_link* old = item;
item = item->next;
delete old;
}
}