list::push_back und Exceptions
-
Hi,
ich habe hier eine (alte) C++-Applikation, bei denen Exceptions deaktiviert sind (-fno-exception). Das geht nicht anders, da die Software konsequent den Rückgabewert von new auf NULL überprüft, nirgends Exceptions nutzt und für ein schnelles Umschreiben einfach vieeeeel zu groß ist.
Spannende Frage jetzt aber: wenn ein Aufruf von std::list::push_back schief geht - wie bekomme ich das dann mit? Der Returnwert ist void und eine Exception gibt es nicht - wie kann ich dann den Erfolg des Aufrufes ermitteln?
-
Ist nicht vorgesehen. Generell ist bei Verwendung der C++-Standardbibliothek etwas wie gccs -fno-exceptions eine sehr schlechte Idee - du müsstest eigene Allokatoren schreiben, und Dinge wie vector::at sind überhaupt nicht mehr drin.
Es sollte mich aber sehr wundern, wenn du diesen Compilerswitch wirklich benötigtest - dass der Compiler Unwinding-Code erzeugt, zwingt dich ja nicht dazu, irgendwo Exceptions zu verwenden. Schlimmstenfalls liegt da halt unbenutzter Code in der Binary.
-
seldon schrieb:
Es sollte mich aber sehr wundern, wenn du diesen Compilerswitch wirklich benötigtest - dass der Compiler Unwinding-Code erzeugt, zwingt dich ja nicht dazu, irgendwo Exceptions zu verwenden. Schlimmstenfalls liegt da halt unbenutzter Code in der Binary.
Naja - was passiert mit nicht abgefangenen Exceptions? Richtig, das Programm macht einen abflug. Und das, obwohl für Fehlerfälle wie einem felhgeschlagenen "new" eigentlich eine ordnungsgemäße Behandlung vorhanden ist. Mit anderen Worten: das Programm verhält sich günstigstenfalls anders, ist im ungünstigeren Fall aber unbenutzbar.
-
Musste halt prüfen, ob sich die size des vectors geändert hat
-
wenn nur das new das Problem ist, könntest du es durch die nothrow Variante ersetzen:
#include <new> int main() { int* a = new(std::nothrow) int; }Die liefert im Fehlerfall 0.