Übergabe des "this" -Zeigers an andere Klassen / Funktionen in Destruktor

8

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.

    
Tobias Brüll 21.10.2017, 07:55
quelle

2 Antworten

7

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%

Aufruf von virtuellen Funktionen

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 auf x 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.

%Vor%

Verwendung von 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%

Verwendung von 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, wird dynamic_­cast führt zu undefiniertem Verhalten.

Gleiches Angebot.

%Vor%

Fazit

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 Ссылка

    
Passer By 21.10.2017, 09:06
quelle
1

Ja, dies ist legal, da das Master-Objekt vor der Beendigung der Ausführung des Destruktors nicht zerstört wird.

Dies ist jedoch im Allgemeinen keine gute Übung.

    
gsamaras 21.10.2017 07:59
quelle