Wahre Ausnahmen: Über die Norm in der C-Speicherverwaltung hinaus
Im Gegensatz zum C-Standard wurde berichtet, dass einige Compiler, wie z VC6 weicht vom erwarteten Verhalten der Rückgabe von std::bad_alloc-Ausnahmen ab, wenn new keinen Speicher zuordnen kann.
Wenn new den angeforderten Speicher nicht abrufen kann, wird normalerweise eine std::bad_alloc-Ausnahme ausgelöst, die sich an die etablierte hält C-Standards. Im Fall von VC6 wurde jedoch ein alternativer Ansatz gewählt.
Anstatt eine Ausnahme zurückzugeben, gab VC6 Berichten zufolge bei einem Speicherzuweisungsfehler 0 (oder NULL) zurück. Dieses vom Standard abweichende Verhalten könnte zu Verwirrung und unerwarteten Ergebnissen im Code führen.
Um das Problem zu bekämpfen, hat Microsoft einen benutzerdefinierten neuen Handler als empfohlene Lösung eingeführt. In Visual C 7.0 und 7.1 (VS2002 und VS2003) wurde jedoch durch ein komplexes Regelwerk bestimmt, ob sich „new“ nicht werfend oder werfend verhält.
Mit der Veröffentlichung von Visual C 8.0 (VS2005) Microsoft hat das Problem durch die Durchsetzung einer einheitlichen Richtlinie gelöst. In dieser Version würde new standardmäßig immer eine Ausnahme auslösen, sofern nicht explizit mit der Objektdatei nothrownew.obj verknüpft.
Für Entwickler, die mit älterem Code arbeiten, der für VC6 entwickelt wurde, kann der Parameter std::nothrow verwendet werden ahmen Sie das Verhalten von new in diesem Compiler nach. Durch die Angabe von new(std::nothrow) kann der Code mechanisch geändert werden, um auf verschiedenen Compilern ähnlich zu funktionieren, wodurch die Notwendigkeit entfällt, bestehende Fehlerbehandlungsmechanismen zu überarbeiten.
Das obige ist der detaillierte Inhalt vonWirft „new' in C immer „std::bad_alloc'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!