Nützlichkeit von 'lösche das' in der Member-Funktion [duplizieren]

8
  

Mögliche Duplikate:
Ist es in Ordnung, mit" delete this "das aktuelle Objekt zu löschen?
Sollten sich Objekte selbst in C ++ löschen?

Ich bin gerade auf diese Frage zu Programmierern gestoßen. Stackexchange und sah die Frage über eine delete this; in einer Member-Funktion tun.

Von dem, was ich verstehe, ist es im Allgemeinen ein Nein-Nein, 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?

    
Tony The Lion 15.12.2010, 11:54
quelle

3 Antworten

5

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

Das heißt, es wird in Dingen wie Microsofts Component Object Model (COM) verwendet, wenn eine Komponente freigegeben wird (ACHTUNG, dies ist nicht genau das, was CashCow hervorhebt und dient nur der Veranschaulichung):

%Vor%

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

    
Moo-Juice 15.12.2010, 12:00
quelle
5

delete this; wird häufig in Referenzzählmustern 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 außerdem, dass sich das Objekt in dem Heap / free-Speicher befindet.

    
doron 15.12.2010 12:02
quelle
0

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

    
stefaanv 15.12.2010 11:59
quelle

Tags und Links