011
15.08.2005, 08:40 Uhr
virtual
Sexiest Bit alive (Operator)
|
Bearbeitung: |
War zu langsam: den einen Fehler habt ihr ja schon!
|
Okay, also die beiden noch nicht genannten Probleme, welche ich im Auge hatte, sind:
1. Der Destruktor von Manager wirft eine Exception. Das darf aber niemals ein Destruktor tun, denn sonst würde ein solches Programm hier immer aborted :
C++: |
try { Manager m1( ... ) ; Manager m2( .... ); } catch(...) { }
|
Obwohl da ne Exception unterwegs ist, wird der catch-Block nie erreicht: Denn nachdem der dtor von m2 aufgerufen wurde, liegt eine Exception an und das Programm verläßt den try Block in Richtung catch block. Dabei wird aber auch m1 abgeräumt und auch da wird eine Exception geworfen. In dieser Situation wird C++ stets terminate aufrufen. was standardmäßig zum Programmabbruch führt.
2. Der Zuweisungsoperator ist nicht exceptionsicher:
C++: |
Person operator = (Person source) { vorname = source.vorname; nachname = source.nachname; // *** return *this; }
|
Wird in der durch "***" Markierten Zeile eine Exception geworfen (etwa std::bad_alloc), so wird das Objekt, dem zugewiesen wird, in einem inkonsistenten Zustand hinterlassen: dann ist bereits der Vorname übernommen worden, aber der Nachname noch nicht.
Es gibt aber in C++ eine sogenannte Exceptiongarantie, welche die Klassen einhalten sollten: nach dem eine Methode mit einer Exception verlassen wurde, darf kein Objekt in einem inkonsistenten Zustand hinterlassen werden.
Die beiden Punkte bilden zusammen mit dem Problem, daß der dtor von Person nicht virtuell ist die drei IMHO problematischsten Fehler. Alle anderen sind [in diesem Beispiel] Performanceeinbussen (Call by value statt call by reference) bzw. Funktionalitätseinschränkungen (fehlendes const beim copy ctor), welche sich bei einem fertigen Programm höchstens dadurch bemerkbar machen, daß das Programm etwas langsamer läuft als man es sich wünschen könnte.
Die anderen drei verursachen jedoch Programmabstürze, welche ggf. nicht reproduzierbar sind, Speicherlöcher und inkonsistenzen in den Daten. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 15.08.2005 um 08:42 Uhr von virtual editiert. |