/Zc:throwingNew (throw-Ausdrücke des Operators „new“ annehmen)
Wenn die Option "/Zc:throwingNew " angegeben ist, optimiert der Compiler Aufrufe, um Überprüfungen auf eine Nullzeigerrückgabe zu operator new
überspringen. Diese Option weist den Compiler an, davon auszugehen, dass alle verknüpften Implementierungen und benutzerdefinierten Zuweisungsverteiler operator new
dem C++-Standard entsprechen und bei Zuordnungsfehlern ausgelöst werden. Standardmäßig generiert der Compiler pessimistisch Nullprüfungen (/Zc:throwingNew-) für diese Aufrufe, da Benutzer eine Verknüpfung mit einer nicht auslösenden Implementierung oder operator new
Schreiben von benutzerdefinierten Allocatorroutinen herstellen können, die Nullzeiger zurückgeben.
Syntax
/Zc:throwingNew[-]
Hinweise
Seit ISO C++98 hat der Standard festgelegt, dass der Standardoperator neu ausgelöst wird std::bad_alloc
, wenn die Speicherzuweisung fehlschlägt. Versionen von Visual C++ bis zu Visual Studio 6.0 haben einen NULL-Zeiger für einen Zuordnungsfehler zurückgegeben. Ab Visual Studio 2002 operator new
entspricht es dem Standard und löst Fehler aus. Um Code zu unterstützen, der den älteren Zuordnungsstil verwendet, stellt Visual Studio eine verlinkbare Implementierung operator new
in nothrownew.obj bereit, die einen NULL-Zeiger beim Fehler zurückgibt. Standardmäßig generiert der Compiler auch defensive NULL-Prüfungen, um zu verhindern, dass diese älteren Allocatoren einen sofortigen Absturz beim Fehler verursachen. Die Option "/Zc:throwingNew " weist dem Compiler an, diese NULL-Prüfungen auslassen zu lassen, wobei davon ausgegangen wird, dass alle verknüpften Speicherzuordnungen dem Standard entsprechen. Dies gilt nicht für explizite nicht auslösende operator new
Überladungen, die mithilfe eines zusätzlichen Typparameters std::nothrow_t
deklariert werden und eine explizite noexcept
Spezifikation aufweisen.
Konzeptionell generiert der Compiler Code zum Erstellen eines Objekts im freien Speicher, um seinen Speicher zuzuweisen, und ruft dann den Konstruktor auf, um den Speicher zu initialisieren. Da der MSVC-Compiler normalerweise nicht erkennen kann, ob dieser Code mit einem nicht konformen, nicht ausgelösten Allocator verknüpft wird, generiert er standardmäßig auch eine NULL-Prüfung, bevor der Konstruktor aufgerufen wird. Dadurch wird eine Nullzeigerentleitung im Konstruktoraufruf verhindert, wenn eine nicht ausgelöste Zuordnung fehlschlägt. In den meisten Fällen sind diese Prüfungen unnötig, da die Standardzuordnungsverarbeiter operator new
anstelle der Rückgabe von NULL-Zeigern ausgelöst werden. Die Kontrollen haben auch unglückliche Nebenwirkungen. Sie überblähen die Codegröße, überfluten den Verzweigungsvorhersager, und sie hemmen andere nützliche Compileroptimierungen, z. B. Die Devirtualisierung oder die Konstverteilung aus dem initialisierten Objekt. Die Prüfungen sind nur vorhanden, um Code zu unterstützen, der mit nothrownew.obj verknüpft ist oder über benutzerdefinierte, nicht konforme operator new
Implementierungen verfügt. Wenn Sie nicht konform sindoperator new
, wird empfohlen, "/Zc:throwingNew" zu verwenden, um Ihren Code zu optimieren.
Die Option "/Zc:throwingNew " ist standardmäßig deaktiviert und wird nicht von der Option "/permissive" beeinflusst.
Wenn Sie mithilfe der Linkzeitcodegenerierung (LINK-Time Code Generation, LTCG) kompilieren, müssen Sie /Zc:throwingNew nicht angeben. Wenn Ihr Code mithilfe von LTCG kompiliert wird, kann der Compiler erkennen, ob die Standardimplementierung operator new
verwendet wird. Wenn ja, lässt der Compiler die NULL-Prüfungen automatisch aus. Der Linker sucht nach dem Flag "/ThrowingNew ", um zu ermitteln, ob die Implementierung operator new
entspricht. Sie können dieses Kennzeichen für den Linker angeben, indem Sie diese Direktive in die Quelle für die neue Implementierung des benutzerdefinierten Operators einschließen:
#pragma comment(linker, "/ThrowingNew")
Weitere Informationen über Konformitätsprobleme in Visual C++ finden Sie unter Nonstandard Behavior.
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Wählen Sie im Dropdownmenü "Konfiguration " die Option "Alle Konfigurationen" aus.
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
Ändern Sie die Eigenschaft "Zusätzliche Optionen" so, dass sie "/Zc:throwingNew" oder "/Zc:throwingNew" enthält, und wählen Sie dann "OK" aus.
Siehe auch
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile
/Zc (Übereinstimmung)
noexcept (C++)
Ausnahmespezifikationen (throw) (C++)
terminate (Ausnahme)