2016-06-07 16 views
0

1) Brauchen wir eine Zeigerüberprüfung für folgenden Code in CLI. Ist es gut zu haben?müssen wir eine Zeigervalidierung für gcnew erstellen

2) Wenn wir einen Speicher in einer Funktion erstellt haben und als Zeiger auf andere übergeben, brauchen wir eine Validierung?

3) Müssen wir das lokal erstellte Objekt in der Referenzübergabe validieren?

NameClass objNameClass; 
foo(&objNameClass); 

foo(NameClass *objNameClass) 
{ 
    if (objNameClass) // do we need to validate here ? 
    { 

Antwort

1

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.

Verwandte Themen