Frage

Ich weiß, dass nach C ++ Standard im Fall der neue Speicher zuzuweisen versagt es soll std :: bad_alloc Ausnahme werfen. Aber ich habe gehört, dass einige Compiler wie VC6 (oder CRT-Implementierung?) Halten sich nicht an sie. Ist das wahr ? Ich frage das, weil nach jeder für NULL überprüft und jede neue Aussage macht Code sehen sehr hässlich.

War es hilfreich?

Lösung

VC6 war nicht konform standardmäßig in dieser Hinsicht. VC6 des new zurück 0 (oder NULL).

Hier sind Microsofts KB Artikel zu diesem Thema zusammen mit ihrer vorgeschlagenen Problemumgehung eines benutzerdefinierten new Handler:

Wenn Sie alten Code haben, der für VC6 Verhalten geschrieben wurde, können Sie das gleiche Verhalten mit neuerem MSVC Compiler (so etwas wie 7.0 und höher) erhalten, indem in einer Objektdatei mit dem Namen nothrownew.obj verknüpfen. Es gibt tatsächlich ein ziemlich kompliziertes Regelwerk in der 7.0 und 7.1 Compiler (VS2002 und VS2003), um zu bestimmen, ob sie nicht werfen oder werfen new Verzug geraten.

Es scheint, dass MS diese in 8,0 bis gereinigt (VS2005) -Jetzt es standardmäßig immer ein wirft neue, wenn Sie speziell auf nothrownew.obj verbinden.

Beachten Sie, dass Sie können angeben, dass Sie new 0 statt werfen std::bad_alloc mit dem std::nothrow Parameter zurückkehren wollen:

SomeType *p = new(std::nothrow) SomeType;

Dies scheint in VC6 zu arbeiten, so könnte es ein Weg, um mehr oder weniger mechanisch den Code zu beheben, das gleiche mit allen Compilern zu arbeiten, so dass Sie die Fehlerbehandlung nicht überarbeiten müssen, um bestehende.

Andere Tipps

Ich mag die (etwas umstritten) Meinung hinzufügen, dass für NULL Überprüfung nach einem Zuordnungsversuch so ziemlich eine Übung in Sinnlosigkeit ist. Wenn Ihr Programm, das jemals in dieser Situation läuft, stehen die Chancen sind Sie nicht viel mehr tun können, als schnell zu verlassen. Es ist sehr wahrscheinlich, dass eine nachträgliche Zuordnung Versuch wird auch fehlschlagen.

Ohne Überprüfung auf NULL, Ihr nachfolgenden Code würde versuchen zu dereferenzieren einem NULL-Zeiger, der das Programm schnell zu beenden neigt, mit einer relativ eindeutig (und leicht debug) Ausgangsbedingung.

Ich versuche nicht, Sie zu sprechen aus für NULL zu prüfen, ist es sicherlich gewissenhaft Programmierung. Aber Sie gewinnen nicht viel von ihm, es sei denn, in ganz bestimmten Fällen, in denen Sie vielleicht einige Recovery-Informationen gespeichert werden können (ohne weitere Zuweisung von Speicher) oder frei weniger wichtig Speicher, etc. Aber diese Fälle werden für die meisten Menschen relativ selten sein.

Dieses gegeben, würde ich nur den Compiler vertrauen bad_alloc zu werfen, persönlich -. Zumindest in den meisten Fällen

Auf der Basis der C ++ Spezifikation, es wird immer std :: werfen bad_alloc, wenn Sie ohne params einfach nur neu verwenden, aber natürlich kann es einige nicht kompatible Compiler sein.

Ich würde Code allerdings nicht mit non c ++ kompatible Compiler kompatibel sein. VC6 einen von ihnen in dieser Hinsicht sein.

Es ist gute Praxis, wenn auch immer Sie Ihren Zeiger auf NULL setzen, nachdem Sie sie löschen. Also aus diesem Grund ist die Überprüfung für NULL noch benötigt.

That being said, hier sind ein paar Optionen, um Ihren Code Reinigung:

Option 1: Einrichten eines eigenen neuen Handler

Ein sicherer Weg, um Ihren Code zu bereinigen wäre zu nennen: eine gute refrence zur weiteren Lektüre

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top