【问题标题】:delete (this) pointer in destructor [closed]析构函数中的删除(this)指针[关闭]
【发布时间】:2020-06-23 21:59:05
【问题描述】:

我编写程序只是为了检查如果我们在类的析构函数中删除这个指针会发生什么。这是我的代码

 class xxx{
    public: xxx(){cout<<"constructor called"<<endl;}
            ~xxx(){cout<<"destructor called"<<endl;delete(this);}  //deleting the 'this' pointer
 };
 int main(int argc, char *argv[])
 {
    xxx *x1=new xxx();
    delete x1;
    return 0;
 }

当我运行这个程序时,它会导致无限循环打印“被调用的析构函数”。

delete 操作符和析构函数有什么关系?当你在析构函数中使用delete this 时会发生什么?

【问题讨论】:

  • 这里还有问题吗?

标签: c++


【解决方案1】:

this-&gt;~destructor 被调用,然后delete(this) 将再次调用this-&gt;~destructor 从而导致函数无限期地调用。

【讨论】:

    【解决方案2】:

    当然你会得到一个无限循环(或者可能是堆栈溢出)。 delete 在释放内存之前调用析构函数,因此如果反过来尝试删除已经被删除的对象,那么您将处于递归死亡螺旋中。

    简单的解决方案是:不要那样做。

    【讨论】:

    • 不是infinte,是栈溢出
    • @Raxvan:除非应用了尾调用优化。
    • 确实在发布时会对其进行优化,但在调试时不会(至少是 VS2013)。
    猜你喜欢
    • 2014-12-30
    • 1970-01-01
    • 2013-10-01
    • 2021-04-04
    • 1970-01-01
    • 2015-02-04
    • 2012-03-13
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多