New() löst eine NULL-Ausnahme aus: Compiler-Konformität
Der C-Standard schreibt vor, dass der neue Operator eine std::bad_alloc-Ausnahme auslöst, wenn Es kann kein Speicher zugewiesen werden. Es wurden jedoch Bedenken hinsichtlich des Verhaltens einiger Compiler geäußert, insbesondere von VC6, die diesen Standard möglicherweise nicht einhalten.
Nichtkonformität von VC6
In diesem Fall von VC6 wurde bestätigt, dass der neue Betreiber den Standard tatsächlich nicht standardmäßig befolgte. Stattdessen wurde bei einem Fehler 0 (NULL) zurückgegeben. Dieses Verhalten stellte Entwickler vor Herausforderungen, da es nach jeder neuen Anweisung explizite Überprüfungen auf NULL erforderte, wodurch der Code ästhetisch unattraktiv wurde.
Antworten und Problemumgehungen von Microsoft
Microsoft hat dies nicht anerkannt -Compliance und stellte eine Problemumgehung mithilfe eines benutzerdefinierten neuen Handlers bereit. Alternativ könnten Entwickler die Objektdatei nothrownew.obj nutzen, um das Verhalten von VC6 in neueren MSVC-Compilern (7.0 und höher) nachzuahmen.
Aktueller Konformitätsstand
Glücklicherweise in MSVC 8.0 (VS2005) wurde das Standardverhalten von new geändert, um dem Standard zu entsprechen, und wirft jetzt a aus std::bad_alloc-Ausnahme im Falle eines Speicherzuweisungsfehlers. Verknüpfungen zu nothrownew.obj sind nur erforderlich, wenn das ursprüngliche VC6-ähnliche Verhalten gewünscht wird.
Option für manuelle Null-Rückgabe
Entwickler haben die Flexibilität, das neue Verhalten anzugeben Geben Sie 0 zurück, anstatt eine Ausnahme auszulösen, indem Sie den Parameter std::nothrow verwenden:
SomeType *p = new(std::nothrow) SomeType;
Diese Technik ermöglicht a konsistenter Ansatz für alle Compiler und vereinfacht die Codewartung, da keine Änderung bestehender Fehlerbehandlungsmechanismen erforderlich ist.
Das obige ist der detaillierte Inhalt vonWarum gibt „new' manchmal NULL zurück, anstatt eine Ausnahme auszulösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!