Ist es legal C ++, ein Worker-Objekt auf dem Stack im Destruktor eines Master-Objekts zu erstellen und den this
-Zeiger des Master-Objekts an das Helper-Objekt zu übergeben? Das Helper-Objekt würde dann auch Member-Funktionen des Master-Objekts oder Access-Member-Variablen aufrufen.
Mit anderen Worten, ist das folgende legale C ++?
%Vor% Ich verstehe, dass die Lebensdauer des Master-Objekts endet, sobald der Destruktor ausgeführt wird. Aber ich glaube, es ist legal, nicht-virtuelle Mitgliedsfunktionen im Destruktor eines beliebigen Objekts aufzurufen, die das implizite this
Argument / Parameter verwenden.
Ja und nein.
Ja, weil es in diesem sehr kurzen Beispiel rechtmäßig ist.
Nein, weil es UB ergeben könnte, gibt es einige Einschränkungen in Bezug auf die Verwendung eines Objekts während der Zerstörung
TLDR Es ist immer in Ordnung, wenn Sie keine Vererbung haben.
Nun, für die Fälle, in denen es nicht ist, ein Objekt während der Zerstörung zu verwenden.
Die folgenden Fälle werden davon ausgehen, dass das Folgende bereits geschrieben ist
%Vor% Bei der Zerstörung von x
(aka, sobald sein Destruktor aufgerufen wird)
Wenn der Aufruf der virtuellen Funktion einen expliziten Klassenmemberzugriff verwendet und sich der Objektausdruck auf das vollständige Objekt von
x
oder eines der Basisklassenunterobjekte dieses Objekts, aber nicht aufx
oder eines seiner Basisklassenunterobjekte bezieht, wird das Verhalten angegeben ist undefiniert.
Dies bedeutet, wenn Sie einen expliziten Klassenmemberzugriff verwenden, um eine virtuelle Funktion mit einem Zeiger aufzurufen, der auf die Gesamtheit von x
zeigt, aber irgendwie ist der Zeiger nicht der Typ von x
oder seine Basen ist undefiniert.
typeid
Wenn sich der Operand von
typeid
auf das Objekt in Konstruktion oder Zerstörung bezieht und der statische Typ des Operanden weder die Klasse des Konstruktors oder Destruktors noch eine seiner Basen ist, ist das Verhalten nicht definiert.
Wenn sich der Operand auf das Objekt bezieht, das zerstört wird, und irgendwie nicht das Objekt und seine Basen, ist das Verhalten ebenfalls undefiniert.
%Vor%dynamic_cast
Wenn sich der Operand von
dynamic_cast
auf das Objekt in Konstruktion oder Zerstörung bezieht und der statische Typ des Operanden kein Zeiger auf oder Objekt der Klasse des Konstruktors oder des Destruktors oder einer seiner Basen ist, wirddynamic_cast
führt zu undefiniertem Verhalten.
Gleiches Angebot.
%Vor% Wenn Sie jetzt denken, dass dies ein Fiasko ist und nicht verstanden hat, was vor sich geht, übergeben Sie this
nicht irgendwo in einem Destruktor.
Alle Zitate aus Ссылка
Tags und Links c++ c++11 object-lifetime destructor this