0
votes

"Supprimer ceci" in Destructor

Si chaque instance d'un programme a eu sa mémoire allouée de manière dynamique à l'aide de nouveau code>, ce serait une bonne idée de les interdire dans le destructeur.

#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;
}


1 commentaires

Souvent, c'est un signe de mauvais design.


3 Réponses :


3
votes

Supprimer n'est pas gratuit . Laissez-moi citer CPPreference sur Supprimer :

Supprimer expression

Si expression n'est pas un pointeur NULL ..., la suppression expresse invoque le destructeur (le cas échéant) pour l'objet qui est détruit.

Après cela, une exception a été lancée ou non par un destructeur, l'expression de suppression invoque la fonction DealLocation: Supprimer (pour la première version de l'expression) ...

Donc, Supprimer ceci; Intérieur ~ C () En général, Supprimer ceci; est autorisé si vous savez ce que vous 'Re faire.


0 commentaires

1
votes

Supprimer cela simplement non autorisé?

Il est rarement utile, mais cela est autorisé.

Un cas où il ne sera jamais utile, c'est le destructeur. Supprimer appelle le destructeur. Si vous appelez le destructeur dans le destructeur qui appelle le destructeur qui appelle le destructeur qui appelle le destructeur qui appelle le destructeur qui appelle le destructeur ... Il y a un problème.


0 commentaires

1
votes

Supprimer PTR; supprime l'objet. Dans le destructeur, supprime ceci; la supprime une seconde fois. Que seul est une catastrophe, mais comme une autre réponse mentionne, cela conduit au destructeur d'être invoqué une seconde fois, donc supprimer ceci; supprime l'objet une troisième fois, ce qui invoque le destructeur, ad infinitum (ou jusqu'au débordement de la pile, selon la première éventualité).


0 commentaires