Bad allocation Ausnahmen in C++
In einem Schulprojekt von mir, die ich gebeten wurde ein Programm erstellen nicht mit STL.
In das Programm, das ich verwenden Sie eine Menge von
Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();
Meine Frage ist über die Zuordnung von Fehlern:
1. gibt es eine automatische Ausnahme, die ausgelöst durch neue, wenn die Allokation fehlschlägt?
2. wenn ja, wie kann ich es fangen, wenn ich nicht mit STL (#include "exception.h
)
3. ist mit der NULL-Tests enugh?
danke.
Ich bin mit eclipseCDT(C++) mit MinGW auf windows 7.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, der neue Betreiber wird automatisch ausgelöst, eine Ausnahme, wenn es nicht in den Speicher.
Sofern Ihr compiler deaktiviert es irgendwie, die neuen Betreiber werden nie wieder ein NULL-Zeiger.
Er wirft einen
bad_alloc
Ausnahme.Gibt es auch ein
nothrow
version der neuen, die Sie verwenden können:Diese version liefert einen null-Zeiger, wenn der Speicher nicht zugeordnet werden kann. Beachten Sie aber auch, dass dies keine Garantie für eine 100%
nothrow
, da der Konstruktor des Objekts können immer noch Ausnahmen.Bisschen mehr Informationen: http://msdn.microsoft.com/en-us/library/stxdwfae(VS.71).aspx
Ja. Siehe dieses Beispiel. Es zeigt außerdem, wie Sie um die Ausnahme zu fangen!
Hier : http://www.cplusplus.com/reference/std/new/bad_alloc/
Ist nicht erforderlich, es sei denn, Sie überlasten die
new
operator!Yes: std::bad_alloc
Meiner Meinung nach, ist das nicht Teil der STL nicht mehr, dass operator new ist. (Sie fangen konnte ... aber verlieren Sie die Möglichkeit, descriminate mit anderen Ausnahmen).
Ist es nicht mehr benötigte, neue wird eine Ausnahme geworfen und nicht NULL zurückgeben.
Standard-C++ eine exception wirft, wenn der angeforderte Speicher nicht reserviert werden. Wenn Sie möchten, dass NULL statt der Ausnahme dann die syntax ist
Diese syntax ist nur ein Fall von "placement new" - Zuweisung, ermöglicht eine Zuweisung der Funktion zum empfangen von Parametern.
Meisten Male, die ich gesehen habe, NULL nach
new
ist in Visual C++ - code, wo das Standard-Verhalten von::operator new
ist NULL zurück, anstatt eine Ausnahme, wie der standard verlangt (das ist IMO einer der vielen Bereiche, in denen Microsoft versucht (versucht?) der Kampf gegen portabler code).Standard new wirft eine bad_alloc exception im Fehlerfall, so dass Ihre null-check nicht benötigt.
Es hängt
Alter c++ - compiler bieten die set_new_handler zu fangen, der Speicherzuweisung.
Sie können auch fangen die bad_alloc exception.
http://en.wikipedia.org/wiki/New_%28C%2B%2B%29
Wenn Sie Steuern möchten, diese können Sie auch überschreiben, die
operator new
/operator delete
paar