我今天正在玩链接列表。尽管我总是遇到相同的问题,析构函数在以任何形式访问析构函数时,似乎总是遇到一个空对象,并抛出一个“违反访问权限错误”。
"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的方式,它都会发生。到目前为止,我发现的解决方案是:对第一个元素调用-simply调用delete,它调用其他元素的析构函数来检查下一行是否为Null,但是它似乎根本没有过滤掉它来迭代地遍历它,但是在这样一个类中也遇到了-try来实现它,这个类的工作非常好,直到现在我不得不实现一个完全相同的错误删除。
我很高兴收到一些关于如何修复/避免这个问题的提示,因为不删除它根本不是一个好主意,而且我根本不确定代码到底出了什么问题。
发布于 2018-08-14 17:21:28
你的破坏者只需要做:
~Liste() {
delete next;
}如果next不是null,那么delete next;将调用下一个元素的析构函数,然后再调用下一个元素的析构函数,依此类推。如果next是null,那么delete next;就不会做任何事情,这很好。
发布于 2018-08-14 17:38:35
与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已经提到的错误内存访问的原因。
https://stackoverflow.com/questions/51846709
复制相似问题