2010-12-15 6 views
8

mögliche Dubletten:
Is it OK to use "delete this" to delete the current object?
Should objects delete themselves in C++?Usefulness von 'löschen diese' in Memberfunktion

Ich kam gerade über this Frage auf programmers.stackexchange und sah die Frage über ein tun delete this; innerhalb einer Mitgliedsfunktion.

Von dem, was ich verstehe, ist es in der Regel ein No-No, aber es gibt einige Umstände, wo dies nützlich sein könnte. Wann wäre so etwas sinnvoll und was sind die technischen Gründe dafür?

+0

Siehe auch http://StackOverflow.com/q/1866193/57428 und http://StackOverflow.com/q/1866461/57428 – sharptooth

Antwort

5

Im Allgemeinen ist es eine schlechte Idee, wie Sie technisch in einer Member-Funktion sind, wenn Sie es tun und plötzlich jedes Mitglied dieser Klasse ist jetzt ungültig. Offensichtlich, wenn Sie nach dem delete this; Anruf nichts berühren, werden Sie in Ordnung sein. Aber es ist sehr einfach, diese Dinge zu vergessen, versuchen Sie, auf eine Membervariable zuzugreifen und ein undefiniertes Verhalten zu erreichen, und verbringen Sie Zeit am Debugger.

Das heißt, es ist verwendet in Dinge wie Microsoft Component Object Model (COM), wenn eine Komponente Freigabe (beachten Sie, ist das nicht genau das, was sie tun, wie cashcow weist darauf hin, und ist nur zu Veranschaulichungszwecken):

void AddRef() { m_nRefs++; } 
void Release() 
{ 
    m_nRefs--; 
    if(m_nRefs == 0) 
     delete this; 
    // class member-variables now deallocated, accessing them is undefined behaviour! 
} // eo Release 

Das heißt, in C++ haben wir intelligente Zeiger (wie boost::shared_ptr), um die Lebenszeiten von Objekten für uns zu verwalten. Da COM interprozeßorientiert und von Sprachen wie VB aus zugänglich ist, waren intelligente Zeiger für das Designteam keine Option.

+0

Ich glaube, es verwendet tatsächlich InterlockedDecrement dh atomare Dekrement, sonst wäre es nicht Thread-sicher . Außerdem sind AddRef und Release const-Funktionen, wobei m_nRefs veränderbar ist, oder Sie konnten Objekte nicht kopieren und ihre Referenzzahl nicht richtig erhöhen. – CashCow

+0

@CashCow, Sie haben recht, aber ich habe es nur als Beispiel gezeigt, anstatt den * genauen * Code anzuzeigen, den COM verwendet, aber ich habe meine Antwort geändert, um zu zeigen, dass sie hypothetisch ist. –

0

Ich benutze es in meiner Nachrichtenverarbeitung. Es ist pre shared_ptr und es lässt die Nachricht entscheiden, ob sie sich selbst löschen (asynchron) oder den Sender entsperren will (synchron).

5

delete this; wird häufig in Bezug Zählmuster verwendet. Das Objekt löscht sich selbst, wenn sein Referenzzähler auf Null fällt. Es ist völlig in Ordnung, sofern nicht auf das zu löschende Objekt Bezug genommen wird. Es erfordert auch, dass sich das Objekt in dem Heap/Free-Speicher befindet.

+2

Haufen. Sie meinen, das Objekt muss auf dem Heap liegen. oder wie es in der C++ Spezifikation bekannt ist: free store. –

+0

@ Lenny222 Nein, es muss mit new zugewiesen werden, um mit delete gelöscht zu werden. – CashCow

+0

@Elemental - Fest – doron