new - wie nun wirklich?
-
Hi,
ich habe hier (älteren) Code, der in etwa sowas fabriziert
myvar=new MyClass(); if (!myvar) { //Fehlerbehandlung ... }Die Man-Page zu "new" sagt jetzt aber, dass eine fehlgeschagene Allozierung eine bad_alloc-Exception werfen würde, außer bei manchen alten Compilern, dort gibt new NULL zurück.
Und nun? Was sagt der Standard? Und wie löse ich sowas, wenn ich möglichst portabel bleiben will?
-
ElBlue schrieb:
Und nun? Was sagt der Standard? Und wie löse ich sowas, wenn ich möglichst portabel bleiben will?
Der Standard sagt bad_alloc (wenn wir mal new_handler, nothrow usw. ausblenden). Was meinst du mit portabel? Hast du das Bedürfnis, 14 Jahre alte Compiler zu unterstützen?
-
Der Standard sagt, dass new eine bad_alloc wirft. Das hat er auch schon immer so gesagt und sofern der Code nicht aus Prästandardzeiten stammt (also älter als 15 Jahre ist und vielleicht sowieso mal überarbeitet werden sollte), dann hatte derjenige der das geschrieben hat keine Ahnung (das new an sich deutet auch schon darafu hin).
-
Ja, std::bad_alloc fangen.
Aber nicht lokal (du kannst an der Stelle wahrscheinlich sowieso nichts machen), sondern irgenwo übergeordnet, wo der Context des Programms eher ersichtlich ist.
Hier kann man den User dazu auffordern, evtl. bspw. ein paar Fenster (MDI) zu schließen, um Speicher freizugeben und die Aktion neu zu beginnen.
Es ist jedoch eher schwierig, mit solch einer Situation umzugehen, in vielen Fällen ist das Sichern wichtiger Daten auf Festplatte und Abbruch des Programms mit einer sinnvollen Fehlermeldung angemessen.
-
Bashar schrieb:
Hast du das Bedürfnis, 14 Jahre alte Compiler zu unterstützen?
Sie müssen noch nicht einmal 14 Jahre alt sein, der bei meiner letzten Firma hat sich eben so verhalten, auch wenn dies an den Einstellungen lag (Mit aktiven Exceptions erzeugte er etwa 2,5mal größere Dateien und die Laufzeit halbierte sich in etwa - Dies bei einer Projektgröße die inkl. dlls bei unteren 3 stelligen MB war).
Auch der VS6 wird heutzutage leider noch sehr häufig verwendet, und dort musste man das Verhalten mit Exceptions und new explizit "aktivieren".
Ansonsten gebe ich durchaus Recht, das dies nicht mehr die Regel sein sollte.