我的二进制搜索树析构函数看起来像这样。
~BSTree()
{
if (this == nullptr || this->left == nullptr && this->right == nullptr)
{
return;
}
this->left->~BSTree();
delete this->left;
this->right->~BSTree();
delete this->right;
}
在调用堆栈获得大约> = 4次调用后,我的程序在if()
处以访问错误异常崩溃。
我的字段只有三个:int key;
,BSTree *left;
和BSTree *right;
似乎this
不是NULL但是它的字段无法从内存中读取。 如何检查是否可以,remove this;
是否可以阻止例外?
答案 0 :(得分:6)
多件事:
除非与新的展示位置一起使用,否则请不要自行调用析构函数。
根据C ++标准,this
不能等于nullptr
。如果是的话,你会遇到更严重的问题。
delete
已经自动调用了析构函数。
delete
可以毫无问题地传递nullptr
。
您的析构函数应该如下所示:
~BSTree()
{
delete left;
delete right;
// possibly ...
left = right = nullptr;
}
答案 1 :(得分:4)
下面的代码应该足够,删除空指针是有效的。
~BSTree()
{
delete left;
delete right;
}
答案 2 :(得分:0)
代码应该是这样的
~BSTree()
{
if ( this->left != nullptr){
delete this->left;
this->left= nullptr;
}
if(this->right != nullptr){
delete this->right;
this->right = nullptr;
}
}
delete operator按顺序完成2件事:
你不应该手动调用析构函数。一个常识是,dest方法在this
对象上调用,所以this
如何null
(可以在null对象上调用析构函数,但是它是一个bug,支票this==nullptr
对那里没有帮助。