首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Destructor总是命中空

Destructor总是命中空
EN

Stack Overflow用户
提问于 2018-08-14 17:18:04
回答 2查看 115关注 0票数 1

我今天正在玩链接列表。尽管我总是遇到相同的问题,析构函数在以任何形式访问析构函数时,似乎总是遇到一个空对象,并抛出一个“违反访问权限错误”。

"this->next“是"0xDDDDDDDD”。

代码语言:javascript
复制
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来实现它,这个类的工作非常好,直到现在我不得不实现一个完全相同的错误删除。

我很高兴收到一些关于如何修复/避免这个问题的提示,因为不删除它根本不是一个好主意,而且我根本不确定代码到底出了什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-14 17:21:28

你的破坏者只需要做:

代码语言:javascript
复制
~Liste() {
    delete next;
}

如果next不是null,那么delete next;将调用下一个元素的析构函数,然后再调用下一个元素的析构函数,依此类推。如果nextnull,那么delete next;就不会做任何事情,这很好。

票数 1
EN

Stack Overflow用户

发布于 2018-08-14 17:38:35

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

代码语言:javascript
复制
~Liste() {
     Liste* temp = nullptr;
     while (next) {
         temp       = next->next;
         next->next = nullptr;
         delete next;
         next       = temp;
     }
 }

关于特定的守则:

代码语言:javascript
复制
~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已经提到的错误内存访问的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51846709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档