Exceptions abarbeiten (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Standard-Exception-Behandlung in C++

Wenn eine Exception ausgelöst wird, übernimmt die Laufzeitbibliothek das ausgelöste Objekt, ruft dessen Typ ab und durchsucht den Aufruf-Stack nach oben nach einer Behandlungsroutine mit dem entsprechenden Typ. Wenn eine Behandlungsroutine gefunden wird, positioniert die Bibliothek den Stack auf die Routine und führt diese aus.

Bei diesem Vorgang ruft die RTL Destruktoren für alle lokalen Objekte in den Stack-Frames auf, die sich zwischen den Punkten befinden, an denen die Exception ausgelöst und abgefangen wird. Wenn dabei ein Destruktor eine Exception auslöst und nicht behandelt, erfolgt der Aufruf von terminate. Destruktoren werden standardmäßig aufgerufen, aber mit der Compiler-Option -xd können Sie diese Vorgabe deaktivieren.

Hinweis: Bei der Stack-Abarbeitung ruft die Laufzeitbibliothek die Destruktoren von Objekten nicht auf, die auf dem Heap und nicht auf dem Stack zugewiesen wurden. Aus diesem Grund verwenden beispielsweise VCL-Anwendungen finally-Blöcke, um sicherzustellen, dass VCL-Objekte (die immer auf dem Heap zugewiesen werden) ordnungsgemäß freigegeben werden. Es gibt nur eine Ausnahme von dieser Regel: die Verwendung von sicheren Zeigern.

Automatisches Freigeben von Zeigern mit RAII-Wrappern

Wenn lokale Variablen als Zeiger auf Objekte verwendet werden, und eine Exception ausgelöst wird, werden diese Zeiger nicht automatisch gelöscht. Der Compiler kann nicht zwischen einem Zeiger auf Daten, der ausschließlich für diese Funktion zugewiesen wurde, und einem anderen Zeiger unterscheiden. Mit der Klasse unique_ptr können Sie sicherstellen, dass lokal zugewiesene Objekte bei einer Exception freigegeben werden. Es gibt aber einen Sonderfall, in dem Speicher für einen in einer Funktion zugewiesenen Zeiger freigegeben wird:

 std::unique_ptr<TMyObject> obj(new TMyObject());

Wenn in diesem Beispiel der Konstruktor von TMyObject eine Exception auslöst, wird der Zeiger auf das für obj zugewiesene Objekt bei der Abarbeitung der Exception von der RTL gelöscht. Dies ist der einzige Fall, in dem der Compiler einen Zeigerwert automatisch löscht.

Hinweis: unique_ptr ist eine Klassen-Template, die auto_ptr entspricht, aber eine bessere Lösung bereitstellt (auto_ptr ist veraltet).

Siehe auch