2013-07-15 8 views
12

Es ist allgemein bekannt, dass, wenn ein Konstruktor einen Befehl auslöst, alle vollständig erstellten Unterobjekte in umgekehrter Reihenfolge zerstört werden, einschließlich der Mitgliedsdaten und aller Arten von Basisklassen. Der Destruktor wird jedoch nicht für nicht delegierende Konstruktoren aufgerufen. Für einen delegierenden Konstruktor wurde das Objekt konstruiert, als der Konstruktor-Körper eingegeben wurde, aber die Konstruktion wird etwas fortgesetzt. Daher stellt sich die Frage, ob der Destruktor der Klasse aufgerufen wird, wenn der delegierende Konstruktor eine Ausnahme innerhalb seines Körpers auslöst?Wird der Destruktor beim Delegieren eines delegierenden Konstruktors aufgerufen?

class X 
{ 
public: 
    X(); 
    X(int) : X() { throw std::exception(); } // is ~X() implicitely called? 
    ~X(); 
}; 
+2

'X' ist kein Member-Objekt von' X', also warum sollte sein Destruktor aufgerufen werden? – Praetorian

+5

@Praetorian: Weil es vollständig vom delegierenden Konstruktor erstellt wurde; und weil der Standard sagt, dass es sein wird. –

+1

Related: http://Stackoverflow.com/q/14386840/981959 –

Antwort

12

Die Regel ist, dass der Destruktor für alle voll konstruierten Objekte aufgerufen wird. Das Objekt wird als vollständig aufgebaut betrachtet, sobald ein Konstruktor fertig ist, einschließlich des delegierten -Konstruktors (obwohl das Programm in einem anderen -Konstruktor fortgesetzt wird).

+0

Können Sie eine Standardreferenz dafür angeben (obwohl es intuitiv sinnvoll ist)? –

+2

@MarkB §15.2/2 "[...] Wenn der nicht delegierende Konstruktor für ein Objekt die Ausführung beendet hat und ein delegierender Konstruktor für dieses Objekt mit einer Ausnahme beendet wird, wird der Destruktor des Objekts aufgerufen. [[]] ...] ". –

+0

Ich bin mir nicht sicher, ob ich dieses Verhalten mag. –

5

Die Lebensdauer eines Objekts beginnt, wenn ein Konstruktor (d.h. Im Falle einer Übertragung der ultima Konstruktor paaren Ziel) abgeschlossen ist erfolgreich . Für die Zwecke von [C++ 03] §3.8 bedeutet "der Aufruf des Konstrukteurs abgeschlossen" einen Aufruf eines Konstruktors. Dies bedeutet, dass eine Ausnahme, die vom Hauptteil eines delegierenden Konstruktors ausgelöst wird, dazu führt, dass das destructorto automatisch aufgerufen wird.

source.

Und here ist ein schöner Artikel über Delegieren von Konstruktoren, sollte jemand es lesen wollen.

+1

Mit Ausnahme der Quelle, die Sie angeben, ist ein früher Vorschlag für das Feature. Die genauen Worte, die du zitierst, haben es nicht in den endgültigen Standard geschafft, oder zumindest kann ich sie nicht finden. Und der "nette Artikel", den Sie zitieren, ist mehr darüber, was zu tun ist, wenn Sie keine Konstruktoren delegieren. –

Verwandte Themen