访问违规'删除'析构函数指针

时间:2014-05-03 11:30:14

标签: c++ exception memory c++11 access-violation

我的二进制搜索树析构函数看起来像这样。

~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;

enter image description here

似乎this不是NULL但是它的字段无法从内存中读取。 如何检查是否可以,remove this;是否可以阻止例外?

3 个答案:

答案 0 :(得分:6)

多件事:

  1. 除非与新的展示位置一起使用,否则请不要自行调用析构函数。

  2. 根据C ++标准,this不能等于nullptr。如果是的话,你会遇到更严重的问题。

  3. delete已经自动调用了析构函数。

  4. delete可以毫无问题地传递nullptr

  5. 您的析构函数应该如下所示:

    ~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件事:

  1. 调用析构函数
  2. 取消分配内存
  3. 你不应该手动调用析构函数。一个常识是,dest方法在this对象上调用,所以this如何null(可以在null对象上调用析构函数,但是它是一个bug,支票this==nullptr对那里没有帮助。