2010-11-29 6 views
13

Mögliche Duplizieren:
Is it OK to use “delete this” to delete the current object?Was passiert, wenn Sie diese in C löschen ++

ich einige Code gerade gesehen, wo sie delete this; in einer Klasse Funktion getan haben, weiß ich, dass dies nicht ein gutes Design, aber ist es definiert, was passieren wird, sagen wir, dass die Klasse immer ein Zeiger von irgendwo ist. Wird es immer auf die richtige Weise gelöscht?

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

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

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

+1

Die verknüpften Beiträge sind verwandt, scheinen aber keine Dubletten zu sein. –

Antwort

17

Es ist völlig legal in C++ zu delete this und ist tatsächlich sehr nützlich für bestimmte Muster wie Smartpointer. Die Last liegt jedoch beim Entwickler, sicherzustellen, dass keine anderen Methoden aufgerufen werden, oder auf dem Stapel für this, der nach dem Löschen auf Instanzdaten zugreifen wird.

Die C++ FAQ Lite hat hierfür einen Eintrag, der

+3

Es gibt viele Dinge in C++, die vollkommen legal sind, aber immer noch eine schlechte Idee. –

0

Wie es von einem Kommentator wies darauf hin, es gibt keine undefinierten Verhalten, wenn keine anderen Mitglieder nach löschen genannt werden Sie der Lage sein werden, um die Funktion fortzusetzen, wenn Sie nicht andere Mitglieder des Objekts zugreifen kann.

+2

Solange keine Membervariable nach der Anweisung 'delete' verwendet wird, ist das Verhalten gut definiert. – MartinStettner

1

Ja lohnt zu lesen. Sie müssen nur darauf achten, dass keine Instanzvariable (und keine virtuelle Methode, glaube ich) nach der delete Anweisung verwendet wird, da der this Zeiger nach der delete nicht mehr gültig ist.

+0

Das ist nicht das Einzige, um das du dich kümmern musst. –

1

Ja, es sollte normal gelöscht werden.

Es gibt einige Situationen, in denen dies nützlich ist, aber es muss besonders vorsichtig vorgegangen werden, um sicher zu gehen, dass danach nie auf das Objekt zugegriffen wird.

0

In diesem speziellen Fall, es ist OK, aber denken Sie was, wenn a automatische Variable ist geschehen würde:

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

Was passiert * genau * wenn du das machst? – Cameron

+0

Ich glaube, genaues Verhalten ist nicht in der Sprache definiert, d. H. Es ist UB. Am wahrscheinlichsten würde die Zuordnungsschicht behaupten, dass die Adresse nicht in ihrem gültigen Bereich ist. Versuchen Sie es :) –

+0

Sie können das tatsächlich verhindern, indem Sie den Destruktor von A schützen. Dann können Sie einen Zeiger auf A nicht anders als den Aufruf seiner abort() - Methode löschen, und Sie können keinen auf dem Stapel erstellen. – CashCow

2

Es ist nicht der Fall, dass delete this; ist schlechtes Design, und es ist definitiv nicht zur Folge hat. Es tut was Sie erwarten würden - es löscht dieses Objekt. Das bedeutet, dass Sie besser sicherstellen sollten, dass Sie nichts anderes mit dem Objekt tun, nachdem delete this aufgerufen wurde.

Die Microsoft MFC-Klassen verwenden delete this; ausgiebig, z. B. in der CWnd (Fenster) -Klasse. Wenn ein Fenster die Nachricht WM_DESTROY empfängt, wird die Window Wrapper-Klasse (die das C++ - Objekt ist) nicht mehr benötigt, also ruft sie delete this; auf (ich denke in PostNcDestroy(), irgendwo so). Es ist sehr nett aus der Sicht des Benutzers des Frameworks: Sie müssen nur daran denken, dass es Möglichkeiten gibt, dass das C++ - Objekt automatisch gelöscht wird und ein wenig vorsichtig am Ende der Lebensdauer des Fensters ist.

Ich bin sicher, dass es viele andere reale Beispiele gibt, wo delete this; ein nützliches Paradigma ist.