我目前正在和链接列表一起玩。 尽管似乎总是遇到相同的问题,但一切正常,但析构函数无论如何,以任何形式访问析构函数时,似乎总是遇到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,但似乎根本没有将其过滤掉 -尝试迭代,但也确实遇到了零 -尝试在一个工作得像这样的类中实现它,直到我不得不实现一个删除,并遇到完全相同的错误
我很高兴收到关于如何解决/避免此问题的提示,因为根本不删除它不是一个好主意,而且我也不知道代码中到底出了什么问题。
答案 0 :(得分:1)
您的析构函数只需要做:
~Liste() {
delete next;
}
如果next
不是null
,则delete next;
将调用下一个元素的析构函数,而后者又将调用下一个元素的析构函数,依此类推。如果next
为null
,则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 所提到的错误的内存访问的原因。