c++ - 递归删除链表c++

标签 c++ list

你能说说,为什么执行下一段代码会导致错误:

void del (num*&head) {
    num*temp = 0;
    if (head!=0) {
        temp = head;
        delete temp;
        del (head->next);
    }
    else return;
}

错误:

Access violation reading location 0xcdcdcdc1.

而下一个代码可以正常工作:

void del (num*&head) {
    if (head!=0) {
        del (head->next);
        delete head;
    }
    else return;
}

最佳答案

删除 temp 会使 head 无效,因为它们都指向同一个对象。 head->next 尝试访问已删除的对象,给出未定义的行为。您应该改为存储 head->next,这样您就不必访问已删除的对象:

if (head) {
    num * temp = head->next;
    delete head;
    del (temp);
}

您正在运行调试版本,因此删除的内存被设置为垃圾,而不是保留其旧内容。这意味着尝试使用从中读取的值作为指针将很快触发访问冲突,帮助您找到问题的根源。

第二个版本会等到您处理完对象后再删除它,因此没有未定义的行为。

但是,递归不是一个好主意,因为如果列表太长,它可能会导致堆栈溢出。迭代会更安全:

while (head) {
    num * temp = head->next;
    delete head;
    head = temp;
}

关于c++ - 递归删除链表c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724360/

相关文章:

list - 在 Haskell 中删除或添加要列出的项目

java 转换列表

javascript - 在 For 循环中探索 javascript 中的树结构

c++ - 如何使用for循环从包含不同派生类的基类数组初始化对象?

c++ - 在 C++ 中遍历可能包含 0xff 的十六进制输入

C++遍历列表以比较位置

python - 从列表中获取特定字符串 - Python

python - 我无法在 for 循环中增加列表中的特定值

c++ - 如果重写的 C++ 函数调用父函数,父函数调用另一个虚函数,那么调用的是什么?

c++ - 有条件地跳过 dll 依赖项