Wann müssen wir "assert" für Zeiger in C++ verwenden, und wenn sie verwendet werden, wie sind sie am häufigsten implementiert?
Hier kommen Makros ins Spiel: assert kann im Debug-Modus einen Kern und im Release-Modus eine Ausnahme erzeugen :)
Wann müssen wir "assert" für Zeiger in C++ verwenden, und wenn sie verwendet werden, wie sind sie am häufigsten implementiert?
Im Allgemeinen würden Sie eine Assert verwenden, um eine Bedingung zu prüfen, die, wenn sie falsch ist, auf einen Fehler in Ihrer Anwendung hinweist. Wenn also ein NULL-Zeiger sollte nicht irgendwann in der Anwendung auftauchen, es sei denn, es liegt ein Fehler vor, dann behaupten Sie es. Wenn es aufgrund einer ungültigen Eingabe auftritt, müssen Sie eine angemessene Fehlerbehandlung durchführen.
Sie haben keine brauchen Assert bei Zeigern überhaupt nicht zu verwenden. Die Idee ist, um sicherzustellen, dass Sie nicht abstürzen, wenn Sie Ihre Zeiger dereferenzieren, wenn sie null sind.
Sie können dies tun mit assert
aber es ist keine sehr professionelle Art, mit solchen Fehlern umzugehen, da es das Programm unweigerlich beendet - keine gute Idee, wenn der Benutzer z. B. seine Dateneingabe der letzten drei Stunden nicht gespeichert hat.
Was Sie debe mit Zeigern zu tun, ist, sie auf Null zu überprüfen und elegant zu scheitern. Mit anderen Worten, lassen Sie Ihre Funktion einen Fehler irgendeiner Art zurückgeben oder nichts tun (nicht jeder wird mit diesem Ansatz einverstanden sein, aber es ist vollkommen akzeptabel, wenn es dokumentiert ist).
El assert
ist meiner Meinung nach dafür gedacht, Probleme während der Entwicklung zu erkennen, weshalb assert in Release-Builds unter einigen Compilern nichts bewirkt. Es ist no ein Ersatz für eine defensive Programmierung.
Wie man es macht:
#include <assert.h>
void doSomethingWithPointer (int *p) {
assert (p != 0);
cout << *p << endl;
}
aber es wäre besser, dies so zu tun:
void doSomethingWithPointer (int *p) {
if (p != 0)
cout << *p << endl;
}
Mit anderen Worten: Selbst wenn Ihr "Vertrag" (API) besagt, dass Sie keine Null-Zeiger empfangen dürfen, sollten Sie sie dennoch anständig behandeln. Ein altes Zitat: sei konservativ in dem, was du gibst, und liberal in dem, was du annimmst (paraphrasiert).
ASSERT-Anweisungen eignen sich hervorragend als "erzwungene Dokumentation", d. h., sie sagen dem Leser etwas über den Code ("Dies sollte niemals passieren") und erzwingen es dann, indem sie Sie wissen lassen, wenn sie nicht zutreffen.
Wenn es etwas ist, das könnte passieren (ungültige Eingabe, Speicher kann nicht zugewiesen werden), ist das no ein Zeitpunkt für die Verwendung von ASSERT. Asserts sind nur für Dinge, die unmöglich passieren können, wenn jeder die Voraussetzungen und dergleichen einhält.
Sie können dies folgendermaßen tun:
ASSERT(pMyPointer);
Erfahrungsgemäß sollten Sie, wenn Sie auf Null-Bedingungen setzen, die nie geschehen unter normalen Bedingungen ist Ihr Programm in einem wirklich schlechten Zustand. Die Wiederherstellung aus einem solchen Null-Zustand wird das ursprüngliche Problem eher verschleiern als beseitigen.
Es sei denn, Sie programmieren mit Ausnahmegarantie im Hinterkopf ( Link ) Ich sage, lasst es abstürzen, dann wisst ihr, dass ihr ein Problem habt.
Ich würde ein ASSERT verwenden, bei dem ein Null-Zeiger nicht sofort zu einem Absturz führt, sondern später zu einem schwer zu erkennenden Fehler führen kann.
z. B:
ASSERT(p);
strcpy(p, "hello");
ist ein wenig unnötig, es ersetzt einfach eine fatale Ausnahme durch eine fatale Assert!
Aber in komplexerem Code, insbesondere bei Dingen wie intelligenten Zeigern, könnte es nützlich sein, zu wissen, ob der Zeiger das ist, was man denkt.
Denken Sie daran, dass ASSERTs nur in Debug-Builds laufen, in der Version verschwinden sie.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.