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;
}
3 Réponses :
Si expression em> n'est pas un pointeur NULL ..., la suppression expresse invoque le destructeur (le cas échéant) pour l'objet qui est détruit. p>
Après cela, une exception a été lancée ou non par un destructeur, l'expression de suppression invoque la fonction DealLocation: Donc, Supprimer code> n'est pas
gratuit code>. Laissez-moi citer CPPreference sur
Supprimer code>: p>
Supprimer code> expression em> p>
Supprimer code> (pour la première version de l'expression) ... P >
blockQuote>
Supprimer ceci; Code> Intérieur
~ C () CODE> En général,
Supprimer ceci; code> est autorisé si vous savez ce que vous 'Re faire. P>
Supprimer cela simplement non autorisé? P> blockQuote>
Il est rarement utile, mais cela est autorisé. p>
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. p>
Supprimer PTR; code> supprime l'objet. Dans le destructeur,
supprime ceci; code> 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; code> 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é). P>
Souvent, c'est un signe de mauvais design.