Ressourcen und throw...
-
Hi,
mir stellt sich gerade die Frage, was mit den Ressourcen passiert, wenn man eine Exception auslöst. Hier ein kleines Beispiel.
short MyFunc (...) { char *pcRes = new char[10]; ... if (...) throw (...); ... delete[] pcRes; return ...; }Da ich mich momentan noch mit den Exceptions anfreunde, bin ich noch nicht so bewandert auf dem Gebiet. Werden die Ressourcen von BS freigegeben oder muss man die gesondert freigeben?

Thx, Maffe
-
std::vector und das Problem ist gelöst.
-
In Java gibts für sowas finally, aber wie es da in C++ ausschaut???
stream = new ... try { ... } catch ... { } finally { stream.close(); }
-
@tipp:
Was hat das denn mit meiner Frage zu tun? Ich kann das Bsp auch für einen anderen Zeigertypen machen.short MyFunc (...) { TMyClass *pMyClass = new TMyClass; ... if (...) throw (...); ... delete pMyClass; return ...; }
-
void f() try { char*p=new char[...]; if (...) throw (p); } catch (char*e) { delete [] e; throw; }
-
#include <memory> short MyFunc (...) { std::auto_ptr<TMyClass> pMyClass( new TMyClass); ... if (...) throw (...); ... return ...; }Komm aber bitte nicht auf die Idee, auto_ptr mit arrays zu verwenden, das geht schief.
-
Werden die Ressourcen von BS freigegeben oder muss man die gesondert freigeben?
Nein sie werden nicht vom BS freigegeben. Die unelegante Lösung wäre ein try{}catch(...){delete x;throw;}delete x; Konstruct. "..." soll wiklich so im Code stehen und nicht von einem Type wie Cpt. Tanga es vorgeschlagen hat ersetzt werden. "..." heist "fange alle Ausnahmen". Die elegante Lösung ist das delete in einen Destruktor zu verfrachten. Das geht am einfachsten mit std::vector, std::auto_ptr, boost::shared_ptr, ... Man sich aber auch selbst eine Klasse schreiben.
-
Also soweit, wie ich das verstanden habe, ist das gar nicht nötig.
Dr. W. Hanrath - C++ schrieb:
[...]
if (sonderfall) throw ausdruck;
Das System bricht hierauf geordnet die Abarbeitung des ganzen tryBlockes
ab, wobei alle innerhalb dieses Blockes auch bei zwischenzeitlich erfolgten
Funktionsaufrufenerzeugten automatischen Variablen wieder zerstört werden
(der Variablenstack wird auf den Zustand zu Beginn des tryBlockes zurückgespult
), der Programmuss wird unmittelbar hinter dem tryBlock fortgesetzt
und das einzige Objekt, was noch vom tryBlock übrig ist, ist das mittels throw
ausgeworfene!
[...]Oder habt ihr da andere Erfahrungen?

-
Maffe001 schrieb:
Also soweit, wie ich das verstanden habe, ist das gar nicht nötig.
In dem Zitat ist von "automatischen" Variablen die Rede. Dynamisch allozierte Objekte (per new) gehören da nicht dazu.
-
@Bashar:
Und was sind automatische Variablen?
-
z.B.
int i;
double d;:p