Wird New jemals NULL zurückgeben?
In C ist der neue Operator für die Speicherzuweisung für neue Objekte verantwortlich. Laut C-Standard wird erwartet, dass new eine std::bad_alloc-Ausnahme auslöst, wenn es fehlschlägt, Speicher zuzuweisen. Es gab jedoch Gerüchte, dass bestimmte Compiler, wie z. B. Visual C 6 (VC6), von diesem Verhalten abweichen.
Nichtkonformität von VC6
Die Gerüchte sind wahr . VC6 hielt sich in dieser Hinsicht standardmäßig nicht an den C-Standard. Wenn new keinen Speicher zuweisen konnte, wurde 0 (oder NULL) zurückgegeben, anstatt eine Ausnahme auszulösen.
Problemumgehung von Microsoft
Microsoft hat dieses Problem erkannt und eine vorgeschlagene Problemumgehung bereitgestellt: Verwenden eines benutzerdefinierten neuen Handlers. Entwickler könnten ihre eigene Implementierung des Operators new angeben, die eine std::bad_alloc-Ausnahme auslöst, anstatt 0 zurückzugeben.
Spätere MSVC-Compiler
In nachfolgenden Versionen von MSVC ( ab 7.0) wurde das Verhalten von new komplexer. Es gab eine Reihe von Regeln, die festlegten, ob eine Ausnahme ausgelöst oder 0 zurückgegeben wurde.
VS2005 und darüber hinaus
Mit VS2005 (MSVC 8.0) hat Microsoft endlich aufgeräumt dieses Verhalten. Standardmäßig löst new jetzt eine std::bad_alloc-Ausnahme aus, sofern nicht explizit mit nothrownew.obj verknüpft.
Alternativer Ansatz: std::nothrow
Entwickler können dies auch angeben Sie möchten, dass new mithilfe des Parameters std::nothrow 0 zurückgibt, anstatt eine Ausnahme auszulösen. Dies ermöglicht ein konsistentes Verhalten über alle Compiler hinweg, selbst mit Legacy-Code, der für VC6 geschrieben wurde.
Das obige ist der detaillierte Inhalt vonWie verhält sich der „neue' Operator in verschiedenen C-Compilern, insbesondere im Hinblick auf Speicherzuweisungsfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!