在析构函数中“删除此”

时间:2020-06-20 05:32:56

标签: c++ class delete-operator

如果已使用new动态分配了程序的每个内存,那么最好在析构函数中对其进行分配。

#include <iostream>

using namespace std;


class c{


    public:

        c(){cout << "Created Object";}


    ~c(){
        delete this;
        cout << "Deleted object";
    }

};



int main(){


    c* ptr = new (nothrow) c();

    if(ptr == NULL){
        cout << "Null pointer" << endl;
        return 1;
    }

    delete ptr;
}

delete this完全不允许吗?this指向使用new分配的内存中的某个位置,那么为什么会导致segmentation fault呢?我知道,代码对于存储在堆栈中的对象不是通用的,但是我正在尝试弄清是否有实现此概念的方法。

3 个答案:

答案 0 :(得分:3)

delete不是free。让我在delete上引用cppreference

delete 表达式

如果 expression 不是空指针...,则delete表达式将为要销毁的对象调用析构函数(如果有)。

此后,不管是否有析构函数引发异常,删除表达式都会调用释放函数:operator delete(对于表达式的第一个版本)...

因此,delete this;中的~c()将调用~c(),最终将导致无限递归。通常,如果您知道自己在做什么,请delete this; is allowed

答案 1 :(得分:1)

删除这根本不允许吗?

它很少有用,但可以使用。

析构函数是永远不会有用的一种情况。删除调用析构函数。如果在调用析构函数的析构函数中调用析构函数,而析构函数又调用析构函数,而析构函数又调用析构函数,而析构函数又调用析构函数,而析构函数又调用了析构函数……这是一个问题。

答案 2 :(得分:1)

delete ptr;删除对象。在析构函数中,delete this;再次将其删除。仅这就是一场灾难,但是正如另一个答案所提到的,这导致析构函数被第二次调用,因此delete this;会第三次删除该对象,这将无限次地调用析构函数(或直到堆栈溢出,无论哪个发生)首先)。