010
04.02.2004, 20:22 Uhr
virtual
Sexiest Bit alive (Operator)
|
@Windalf:
Jetzt mal losgelöst von der Frage Constructor oder nicht:
C++: |
void func() { char* x = new char[100000]; char* y = new char[100000];
... delete[] x; delete[] y; }
|
Nehmen wir mal an, daß das new für y schief gegangen wäre. Ein ANSI C++ kompatibler Compiler würde hier eine std::bad_alloc Exception werfen (der VC übrigens nicht!). Nun ist die Situation ja die, daß Du ein Speicherloch hast, weil für x schon Speicher belegt wurde und durch die Exception die Funktion verlassen wird. Wir wollen ja eigentlich zwei Dinge: zum einen wollen wir das Speicherloch vermeiden (dh. x freigeben) und gleichzeitig wollen wir, daß die Exception durchgereicht wird, also an den Aufrufer von f gelangt. Dies kann man nur dadurch hinbekommen, daß man die Exception zunächst in f fängt und dann auch wieder throwt (das habe ich im letzten Post vergessen, bin heute leider nicht ganz bei mir):
C++: |
void func() { char* x = NULL; char* y = NULL;
try { x = new char[100000]; y = new char[100000]; } catch(...) // ... fängt jede Exception { // Vermeide Speicherlöcher durch Freigabe. delet kommt auch mit NULL pointern klar! delete [] x; delete [] y; // Reiche die Exception weiter: [b][u]throw[/u][/b] } }
|
Analog sollte Dein Constructor aufgebaut sein. Beim Constructor kommt eben nur eine Besonderheit hinzu: Wird er mit einer Exception verlassen, werden die Destructoren der ggf. vorhandenen Basisklassen implizit aufgerufen. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |