Im folgenden Code wird die stackbasierte Variable 'ex' in einer Funktion ausgelöst und abgefangen, die über den Bereich hinausgeht, in dem ex deklariert wurde. Das erscheint mir etwas seltsam, da (AFAIK) stack-basierte Variablen nicht außerhalb des Gültigkeitsbereichs verwendet werden können, in dem sie deklariert wurden (der Stack wird abgewickelt).Wie werden Ausnahmen, die auf dem Stack zugewiesen sind, über ihren Gültigkeitsbereich hinaus erfasst?
void f() {
SomeKindOfException ex(...);
throw ex;
}
void g() {
try {
f();
} catch (SomeKindOfException& ex) {
//Handling code...
}
}
Ich habe eine print-Anweisung zu SomeKindOfException Destruktor hinzugefügt und es zeigt, dass ex zerstört wird, wenn es außerhalb des Gültigkeitsbereiches in f geht(), aber dann ist es in g gefangen() und zerstört wieder, sobald es aus geht Umfang dort auch.
Irgendwelche Hilfe?
Stimmt es, hier eine Referenz zu verwenden? 'catch (SomeKindOfException & ex)' Ich denke, das ist gefährlich, da es den Kopierkonstruktor nicht aufruft und Sie Zugriff auf einen Speicherbereich erhalten, der zu dem zugeordneten Stack von f() gehört! Ich denke, dass dies sollte stattdessen korrekt sein: 'catch (SomeKindOfException ex)' – Dacav
Es ist richtig (und noch besser - siehe http://www.parashift.com/c++-faq-lite/exceptions.html Abschnitt 17.7) durch Bezugnahme zu fangen. Als die Antworten auf meinen Fragezustand ist die Ausnahme, die abgefangen wird, nicht das stack-basierte Objekt, sondern eine Kopie davon, die an einem anderen Ort residiert, die den Stack-Abbau überstehen kann, daher gibt es kein solches Risiko. –
Nun, ich habe gestern Abend ein Experiment durchgeführt und ja, es ist viel besser, die Referenzen zu verwenden. Sehen Sie sich das an: http: // Pastebin.com/8YQuNAux Wenn Sie es ausführen, können Sie feststellen, dass die Ausnahme bei jedem Fang ohne Verweis dynamisch zugeordnet wird (im Sinne von "neu"): Wenn Sie die Verweise verwenden, wird es stattdessen nur einmal zugewiesen und automatisch zerstört Der Umfang ist beendet. Ich denke auch, dass dieses Verhalten streng vom Compiler abhängt. – Dacav