Es ist genauso unnötige nur nach einer gcnew
, wie es nach einem new
ist. Es ist nur notwendig, wenn Sie C-Allokatoren wie malloc
aus irgendeinem Grund verwenden. Die C++ - und C++/CLI-Konstrukte verwenden Ausnahmen für nicht erfolgreiche Objektkreationen, im Gegensatz zu den C-Funktionen, die einen Nullzeiger zurückgeben.
In Plain C++, new
wird std::bad_alloc
werfen, wenn Speicher nicht zugewiesen werden kann. In C++/CLI wird gcnew
in diesem Fall System::OutOfMemoryException
werfen.
In den meisten Fällen sollten Sie wahrscheinlich die Ausnahme propagieren und Ihr Programm beenden, weil es wahrscheinlich sowieso zum Scheitern verurteilt ist.
In Ihrem zweiten Beispiel Sie kann will die Zeiger in foo_2
nur bestätigen, wenn Sie jemand erwarten foo_2
rufen mit einem Null-Zeiger, und wenn die eine gültige Nutzung. Wenn es eine ungültige Verwendung ist, um einen Null-Zeiger als Argument zu übergeben, dann haben Sie einen Fehler und sollten Ihre Anwendung wahrscheinlich abstürzen lassen (anstatt dass sie Ihre Daten für Beispiel verfälschen würde). Wenn foo_2
nur für den Code sichtbar ist, der es unmittelbar nach der Zuweisung aufruft, ist dies unnötig, da es niemals null ist.
Gleiches für das dritte Beispiel. Der Vertrag/Dokumentation Ihrer Funktion sollte angeben, ob es gültig ist, es mit einem Nullzeiger aufzurufen, und wie es sich verhält.
Und bitte, nicht jemals dass schreiben:
catch(std::bad_alloc &error)
{
std::cout << error.what() << std::endl;
}
Wenn Sie eine Bedingung für wenig Arbeitsspeicher auf einer regelmäßigen Objektzuordnung haben, nur Ihr Programm sterben lassen. Der Versuch, es auf diese Weise zu heilen, wird dich nicht sehr weit bringen.
Der einzige Ort, an dem ein solcher Code akzeptabel wäre IMHO ist, wenn Sie versuchen, ein potenziell großes Array dynamisch zuzuordnen, und Sie wissen, dass Sie diesen Vorgang einfach abbrechen können, wenn Sie dies nicht können. Versuchen Sie nicht, Zuordnungsfehler für jede Zuordnung zu erfassen, die Ihren Code aufblähen und Sie nirgendwohin führen.