Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verhält sich der „neue“ Operator in verschiedenen C-Compilern, insbesondere im Hinblick auf Speicherzuweisungsfehler?

Wie verhält sich der „neue“ Operator in verschiedenen C-Compilern, insbesondere im Hinblick auf Speicherzuweisungsfehler?

Susan Sarandon
Susan SarandonOriginal
2024-11-17 20:14:02541Durchsuche

What is the Behavior of the `new` Operator in Different C   Compilers, Especially Regarding Memory Allocation Failure?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn