Lokale Objekte und Exceptions

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Lokale Objekte und Exceptions
Kurze Frage: Wenn ich in einer Funktion lokale Objekte instanziiert habe, und die Funktion durch eine Exception (throw… oder ‘Durchreichen’ von Funktionsaufruf) verlasse, werden diese Objekte dann korrekt geloescht, also der Destruktor aufgerufen? Oder wird dieser Kontext dann panikartig verlassen, ohne irgendetwas aufzuraeumen?


just do it?

=> der destruktor wird nur bei abgefangenen exceptions aufgerufen, und dann auch nur von lokalen objekten, nicht von dynamischen.


Hmm, was für einen kompiler benutzt du kabel? Bei mir wird nämlich auch bei einer nicht abgefangener Exception der Destruktor aufgerufen. Ich hab es auch mit deinem Code ausprobiert. So sollte es nämlich auch sein.
Wenn eine exception einen Block verlässt, werden alle Destruktoren von Objekten, deren Gültigkeit endet aufgerufen. Da ein Objekt das du mit new erstellst bis zum delete lebt, wird dessen destruktor beim verlassen des Funktionsblocks natürlich nicht aufgerufen.
Was aber sein kann, ist das der Kompiler bei dem Testprogramm einiges wegoptimiert, weil die Objekte ja garnicht wirklich benutzt werden.


g++ version 3.3.4 (Debian)
selbst, wenn ich func_b () etwas komplizierter gestalte

verhält es sich genauso.


hier dasselbe

frahi@A1100:/tmp > cat test_is_a_bad_name_for_a_testing_program_in_Unix_environments.cpp[/color]
#include <iostream>

using namespace std;
struct A {
  int b;
  A(int i) : b(i) {}
  ~A () {cerr<<b<<" destruktor"<<endl;}
};
void func_b () {
   A C(1);
   A* b = new A(2);
   throw 123;
}
int main (void) {
  try {func_b ();} catch (...) {}
  cerr << "second call" << endl;
   func_b ();
   return 0;
}
frahi@A1100:/tmp >  ./test_is_a_bad_name_for_a_testing_program_in_Unix_environments 
1 destruktor
second call
Aborted

wegoptimiert werden darf der Compiler da gar nicht, des wuerde ja das verhalten aendern


Seltsam. Mein gcc 2.95.4 gibt mir:

1 destruktor
second call
1 destruktor
Aborted

Und prinzipiell würde ich auch das verhalten erwarten. Weiß jemand, was der Standart dazu sagt?


http://www.kuzbass.ru:8086/docs/isocpp/except.html#except.ctor

da kein try-block vorhanden ist, sollte also auch kein destruktor aufgerufen werden?
wohin fliegt die exception, wenn sie keiner aufhält? :smiley:

btw
test_is_the_best_name_for_a_testing_program_in_Unix_environments.cpp
:wink:


libc scheinbar und die schickt ein SIGABRT oder so: