"удалить это" в деструкторе - PullRequest
0 голосов
/ 20 июня 2020

Если для каждого экземпляра программы память динамически выделялась с использованием 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;
}

Is delete this просто не разрешено ? this указывает на место в памяти, которое было выделено с помощью new, так почему это должно вызвать segmentation fault? Я знаю, что код не является общим c для объектов, хранящихся в стеке, но я пытаюсь выяснить, есть ли способ реализовать эту концепцию.

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

delete не free. Позвольте мне процитировать cppreference на delete:

delete выражение

Если выражение не нулевой указатель ..., выражение удаления вызывает деструктор (если есть) для уничтожаемого объекта.

После этого, независимо от того, было ли создано исключение каким-либо деструктором, выражение удаления вызывает освобождение функция: либо operator delete (для первой версии выражения) ...

Итак, delete this; внутри ~c() вызовет ~c(), и вы получите бесконечную рекурсию . Как правило, delete this; допускается , если вы знаете, что делаете.

1 голос
/ 20 июня 2020

delete ptr; удаляет объект. В деструкторе delete this; удаляет его второй раз. Это само по себе является катастрофой, но, как упоминается в другом ответе, это приводит к вызову деструктора во второй раз, поэтому delete this; удаляет объект в третий раз, который вызывает деструктор, до бесконечности (или до переполнения стека, в зависимости от того, что наступит раньше ).

1 голос
/ 20 июня 2020

удалить это просто не разрешено?

Это редко полезно, но разрешено.

Один случай, когда он никогда не будет полезен, - это деструктор. Delete вызывает деструктор. Если вы вызываете деструктор в деструкторе, который вызывает деструктор, который вызывает деструктор, который вызывает деструктор, который вызывает деструктор, который вызывает деструктор ... Возникла проблема.

...