【发布时间】:2018-08-14 17:18:04
【问题描述】:
我今天正在玩链表。 尽管我似乎总是遇到同样的问题,但我的一切工作都很好,无论如何,析构函数似乎总是在以任何形式访问析构函数时遇到 NULL 对象,抛出“访问权限冲突错误”
“this->next”是“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 并调用其他元素的析构函数 - 尝试检查下一行是否为空,但它似乎根本没有过滤掉它 -尝试迭代地通过它,但这也确实遇到了零 - 尝试在一个确实可以正常工作的类中实现它,直到我不得不实现一个遇到完全相同错误的删除
我很高兴收到一些有关如何修复/避免此问题的提示,因为根本不删除它不是一个好主意,而且我完全不确定代码中到底出了什么问题。
【问题讨论】:
-
欢迎来到 Stack Overflow。请花点时间浏览The Tour,并参考Help Center 的材料,了解您可以在这里询问什么以及如何询问。特别重要的是发一个minimal reproducible example。
-
根据Wikipedia's great list of magic debug codes,0xDDDDDDDD 表示访问已释放的内存。知道你The Rule of Three!
-
不相关的
next->~Liste();是个坏主意。您几乎从不想手动调用析构函数(值得注意的例外是非 POD 联合成员和使用placement new 构造的对象)。请改用delete next;。 -
由于手动调用析构函数,您的程序中存在内存泄漏,但这不太可能是该内存访问的根本原因。没有minimal reproducible example,我们无法为您提供帮助。
标签: c++ recursion linked-list