析构函数总是命中Null

时间:2018-08-14 17:18:05

标签: c++ recursion linked-list

我目前正在和链接列表一起玩。 尽管似乎总是遇到相同的问题,但一切正常,但析构函数无论如何,以任何形式访问析构函数时,似乎总是遇到NULL对象,并抛出“访问权限冲突错误” < / p>

  

“此-> 下一个”为“ 0xDDDDDDDD”。

struct Liste {
Liste *next;
int content;
Liste() {
    content = 0;
    next = nullptr;
};
~Liste() {
    if (next == nullptr) {
        return;
    }else if (next->next == nullptr){
        delete next;
        return;
    }else {
        next->~Liste();
    }
};
};

我非常不确定并且对此错误的根源可能是好奇的。 无论我尝试对它使用delete的方式,它总是会发生。 我到目前为止发现的解决方案是: -仅在第一个元素上调用delete,然后调用其他元素的析构函数 -尝试检查下一行是否为Null,但似乎根本没有将其过滤掉 -尝试迭代,但也确实遇到了零 -尝试在一个工​​作得像这样的类中实现它,直到我不得不实现一个删除,并遇到完全相同的错误

我很高兴收到关于如何解决/避免此问题的提示,因为根本不删除它不是一个好主意,而且我也不知道代码中到底出了什么问题。

2 个答案:

答案 0 :(得分:1)

您的析构函数只需要做:

~Liste() {
    delete next;
}

如果next不是null,则delete next;将调用下一个元素的析构函数,而后者又将调用下一个元素的析构函数,依此类推。如果nextnull,则delete next;将不执行任何操作,这很好。

答案 1 :(得分:1)

previous answer相比,没有堆栈溢出:

~Liste() {
     Liste* temp = nullptr;
     while (next) {
         temp       = next->next;
         next->next = nullptr;
         delete next;
         next       = temp;
     }
 }

关于给定的代码:

~Liste() {
    if (next == nullptr) {
        return;
    } else if (next->next == nullptr){
        delete next;
        return;
    } else {
        next->~Liste(); // *next is destructed, but next is not deallocated!
    }
};

但是,给定的代码(包括析构函数)可能不是 Slava 所提到的错误的内存访问的原因。