frage zu lokalen objekten
-
Auch wenn ich 10 Brüche in dem Block erzeuge, so werden trotzdem alle noch über Pointer gefunden
D.h. ich sollte sollche Konstrukte vermeiden, auch wenn es (glücklicherweise?) funktioniert, oder?Gruß Jessy
-
Jessy12 schrieb:
Auch wenn ich 10 Brüche in dem Block erzeuge, so werden trotzdem alle noch über Pointer gefunden

Undefiniertes Verhalten. D.h es kann wirklich alles passieren, z.B. dass du ne Weile drauf zugreifen kannst, irgendwann aber vielleicht nicht mehr. Es wäre sogar standardkonform, wenn dir der Zugriff die Platte zerlegt, den Rechner bunt anmalt oder sonstwas - weil der Standard eben sagt, dass bei UB alles mögliche passieren kann.
D.h. ich sollte sollche Konstrukte vermeiden, auch wenn es (glücklicherweise?) funktioniert, oder?
Definitiv.
-
Dann hätte ich gleich noch eine Frage zu einem von mir anders erwarteten Verhalten:
double calcSqrt(double d) throw(int) { if(d < 0.0) throw new Bruch(1,1); double erg = sqrt(d); return d; } int main() { try { double erg = calcSqrt(-1); cout << erg << endl; } catch(...) { cout << "Fehler!" << endl; } }Das throw(int), so habe ich gelesen, sagt ja aus, dass nur(!) int werte geworfen werden dürfen. Andernfalls wird eine interne Methode unexpected() aufgerufen, die das Programm anscheinend beendet. Wenn ich den Code aber nun Ausführe, so komme ich komischerweise trotzdem in den catch-Block, obwohl ich doch vorgegeben habe, dass nur(!) int-Werte geworfen werden dürfen. Ich werfe aber ein Bruch-Objekt...
Warum wird denn nun trotzdem der catch-Block ausgeführt? Die throw(int)-Anweisung scheint keinen Unterschied zu machen

mfg Jessy
-
Manche Compiler beachten solche exception-Spezifikationen nicht. Erstens ist das nicht ganz einfach zu implementieren, zweitens verursacht das einen ziemlichen Overhead im generierten Code und im Laufzeitverhalten. Exceptionspezifikationen sind sowieso ziemlicher Mist, wenns nicht grade die nothrow-Spezifikation ist. Aus dem Grund ist alles außer nothrow im neuen Standard auch deprecated.
-
Ohne die Func calcSqrt zu bewerten; mit 'catch(...) ' fängst du meines Wissens alles.
-
Klar fange ich damit alles ... aber es geht doch gerade darum, dass der Ausdruck throw() bewirken soll, dass nur noch die Typen, die in der Klammer stehen geworfen werden dürfen.
Also sagst Du, dass das am Compiler liegt und ich das Prinzip richtig verstanden habe, oder? Ich habe mich nur gefragt, ob ich irgendetwas an dem Konzept nicht richtig verstanden habe

mfg Jessy
-
Jessy12 schrieb:
Also sagst Du, dass das am Compiler liegt und ich das Prinzip richtig verstanden habe, oder?
Jap. Behalt das Wissen im Hinterkopf, verzichte aber auf Exceptionspezifikationen (außer throw() bzw noexcept in Ausnahmefällen)
-
Siehe auch http://www.cpp-tutor.de/cpp/le17/std_exception.html unter 'bad_exception'
Gruß
-
kommst du aus der java ecke?
weil du throwst einen new Bruch...
du reservierst also speicher den du nie freigibst, in java ist das normal, da übernimmt sowas der garbage collector, aber hier in c++ ists böse...
-
Ja, das hast du richtig erkannt
Ich habe mitte letzter Woche mit c++ angefangen. Allerdings ist mir der Fehler klar. Das war wohl reine Gewohnheit.Trotzdem danke für den Hinweis
