In welcher Reihenfolge sind die Destruktoren aufgerufen und member-Variablen, zerstört in C++ mit inhertitance?
Sehr ähnliche Frage wie dieser, außer nicht genau: Was ist die Reihenfolge, in der die Destruktoren und Konstruktoren aufgerufen werden in C++
Um Mitglied der Konstruktor und der Destruktor ruft
Möchte ich wissen: sind die member-Variablen der abgeleiteten Klasse zerstört wird, bevor oder nachdem der Destruktor der Basisklasse aufgerufen wird?
Dies ist in C++ unter Verwendung von Visual Studio 2008. Danke.
- Die Mitglieder sind zerstört, nachdem der Destruktor ausgeführt wird (da der Destruktor darauf zugreifen darf, und die meiste Zeit hat, um freie Ressourcen, etc.)
- Erwähnenswert ist, dass Destruktoren immer in der entgegengesetzten Reihenfolge wie Konstruktoren, auch wenn letztere nicht angegeben ist (z.B. Globale Objekte). So müssen Sie nur daran denken, eine oder die andere. Mindestens, ich glaube, dass dies wahr ist, und wäre daran interessiert zu sehen, ein Gegenbeispiel...
- Es ist ein Fall, der nicht passt (und nur eine): Entladen eines dynamisch geladenen shared object (.so / .dll / ...). Immer noch,, der außerhalb der Zuständigkeit der standard.
- Danke. Nur die "Art" gilt als eine Ausnahme, IMO, aber lohnt sich zu wissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konstruktor: erste base, dann abgeleitet
Zerstörung:
code:
Referenzen & virtuellen Destruktor
Wenn Sie planen, zu dynamisch reserviert werden (z.B. wenn Sie die Schlüsselwörter verwenden, die
new
&delete
) ein abgeleitetes Objekt, dann immer haben einevirtual
oder eineprotected
Destruktor auf Ihre Basis. Dynamisch löschen des Objekts auf Basis der Klasse Referenz würde sonst dazu führen Speicherverluste im Beispiel unten:Ausgabe:
Nur Basis-Daten bereinigt und
longArray
Lecks.Hier ist, was der standard sagt,... (C++11, 12.4/8)
Beachten Sie, dass diese Reihenfolge ist in der Tat die Umkehrung der Reihenfolge gegeben, in 12.6.2/10 in C++11. Sie können nicht sagen, was die Reihenfolge der Zerstörung der virtuellen Basen ist aus der Betrachtung 12.4/8 allein, aber Sie können ableiten, es von 12.6.2/10, die angibt, dass die Initialisierung des virtuellen Basen tritt in Tiefensuche von Links nach rechts um. (Also, die Zerstörung von virtuellen Basen erfolgt in umgekehrter Reihenfolge.)
Sowieso, Sie haben Ihre Antwort. Nicht-statische member sind zerstört zuerst, dann Basisklassen. Aber eine Basis-Klasse-Mitgliedern werden zerstört, bevor die nächsten Basisklasse destructor beginnt. Es ist wirklich genau wie Tiefe-zuerst-Suche.