递归删除链表,使用 new 分配内存
Recursively deleting a linked list, memory was allocated using new
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;
}
}
相关文章:
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- C++ 使用 'new' 分配顺从内存分配
- 使用运营商New分配的数据结构是否有任何副作用
- 未'new'分配给指针而创建的对象的生存期
- 用new分配4k int后的内存覆盖
- 使用free()释放new分配的内存空间
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- 使用 init 方法来避免使用 new 分配对象是这种糟糕的设计
- delete命令会清除用new分配的内存吗
- new分配了多少字节
- C++本地对象超出范围,返回指针(使用new分配的内存).因此内存泄漏
- 检索在函数内部使用运算符new分配的类指针对象成员的值时出现的问题
- 递归删除链表,使用 new 分配内存
- 从函数返回指向对象的指针,而不使用 new 分配指针
- 删除使用placement new分配的动态多态对象
- C++new分配的空间比预期的要多
- 如何在char*func()中正确删除用new[]分配的char数组
- new[]分配的内存大小
- 是未使用在堆栈或堆上分配"new"分配的对象
- delete(非数组形式)是否知道new或new[]分配的内存总量