2010-11-29 42 views
13

Possible en double:
Is it OK to use “delete this” to delete the current object?Que se passerait-il si vous supprimez ce en C++

Je viens de voir un code où ils ont fait delete this; en fonction de la classe, je sais que cela est pas un bon design mais est-il défini ce qui va se passer, disons que la classe est toujours un pointeur de quelque part. Sera-t-il toujours supprimé de la bonne façon?

class A 
{ 
public: 
    void abort() { delete this; } 
}; 

class B 
{ 
    void func() { A* a = new A; a->abort(); } 
}; 
+2

Voir http://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this/447531#447531 – icecrime

+1

Les publications liées sont liées, mais ne semblent pas être des doublons. –

Répondre

17

Il est parfaitement légal en C++ à delete this et est en fait très utile pour certains modèles comme les pointeurs intelligents. Le fardeau est sur le développeur pour s'assurer qu'aucune autre méthode n'est appelée ou sur la pile pour this qui accèdera aux données d'instance après la suppression.

Le C++ FAQ Lite a une entrée pour ce qui mérite d'être lu

+3

Il y a beaucoup de choses en C++ qui sont parfaitement légales mais qui restent une mauvaise idée. –

0

Comme il a été souligné par un commentateur, il n'y a pas un comportement non défini que si aucun autre sont appelés après la suppression Vous serez en mesure de continuer à la fonction si vous ne lisez pas les autres membres de l'objet.

+2

Tant qu'aucune variable membre n'est utilisée après l'instruction 'delete', le comportement est bien défini. – MartinStettner

1

Oui. Vous devez seulement faire attention, qu'aucune variable d'instance (et aucune méthode virtuelle, je pense) n'est utilisée après l'instruction delete, puisque le pointeur this ne sera plus valide après le delete.

+0

Ce n'est pas la seule chose dont vous devez prendre soin. –

1

oui, il devrait être supprimé normalement.

Il y a quelques occasions où cela est utile, mais il faut faire très attention à ce que l'objet ne soit jamais accessible après cela.

0

Dans ce cas particulier, il est OK, mais ce qui se passerait si a est variable automatique:

void foo() { 
    A a; 
    a.abort(); // BOOM! 
} 
+0

Que se passe-t-il exactement lorsque vous faites cela? – Cameron

+0

Je crois que le comportement exact n'est pas défini dans la langue, c'est-à-dire que c'est UB. Le plus probablement, la couche alloueuse affirmerait que l'adresse n'est pas dans sa plage valide. Essayez-le :) –

+0

Vous pouvez empêcher cela en rendant le destructeur de A protégé. Ensuite, vous ne pouvez pas supprimer un pointeur sur A autre que l'appel de sa méthode abort() et vous ne pouvez pas en créer un sur la pile. – CashCow

2

Il est pas le cas que delete this; est mauvaise conception, et il n'a certainement conduit pas à un comportement non défini. Il fait ce que vous attendez - il supprime cet objet. Cela signifie que vous feriez mieux de vous assurer que vous ne faites rien d'autre avec l'objet après avoir appelé delete this.

Les classes Microsoft MFC utilisent largement delete this;, par exemple dans la classe CWnd (window). Quand une fenêtre reçoit le message WM_DESTROY, la classe de wrapper de fenêtre (qui est ce que l'objet C++ est) n'est plus nécessaire, donc elle appelle delete this; (je pense en PostNcDestroy(), quelque part comme ça). C'est très intéressant du point de vue de l'utilisateur du framework: il suffit de se souvenir qu'il existe des moyens pour que l'objet C++ soit automatiquement supprimé et fasse attention à la fin de la vie de la fenêtre.

Je suis sûr qu'il y a beaucoup d'autres exemples du monde réel où delete this; est un paradigme utile.