Destructor vs Mitglied Funktionsrennen

7

Wenn ich in einem Destruktor bin, ist es möglich, dass ein anderer Thread die Elementfunktion des Objekts startet? Wie man mit dieser Situation umgeht?

    
jackhab 20.01.2009, 16:15
quelle

3 Antworten

17

C ++ hat keinen eigenen Schutz gegen die Verwendung eines Objekts nach dem Löschen - vergessen Sie die Rennbedingungen - ein anderer Thread könnte Ihr Objekt verwenden, nachdem es vollständig gelöscht wurde.

Entweder:

  1. Stellen Sie sicher, dass nur ein Platz in der Code besitzt das Objekt, und es ist verantwortlich für das Löschen wenn niemand benutzt das Objekt.
  2. Mach das Objektreferenz gezählt - von hinzugefügt expliziter Referenzzählcode, oder eine geeignete Basisklasse finden das implementiert Referenzzählung
Douglas Leeder 20.01.2009, 16:29
quelle
15

Sie sollten ein Objekt nicht zerstören, wenn Sie nicht sicher sind, dass nichts anderes versucht, es zu benutzen - im Idealfall hat nichts anderes einen Hinweis darauf. Sie müssen sich genauer ansehen, wenn Sie delete aufrufen.

    
DJClayworth 20.01.2009 16:17
quelle
2

Wenn Sie sich in einem Destruktor befinden, weil sich der Stack im Exception-Handler abwickelt, empfehle ich, Ihren Code so umzuordnen, dass Sie Exceptions innerhalb eines serialisierten Blocks abfangen können.

Nach dem Block überprüfen Sie, ob das Objekt noch gültig ist und rufen Sie Ihre Methode auf. Auf diese Weise ermöglicht die Ausnahme in einem Thread anderen Threads, den Aufruf von Destruktor ordnungsgemäß zu behandeln.

    
Sergey Golovchenko 20.01.2009 16:36
quelle

Tags und Links