9 Stimmen

Verwendung von "assert" mit Zeigern in C++

Wann müssen wir "assert" für Zeiger in C++ verwenden, und wenn sie verwendet werden, wie sind sie am häufigsten implementiert?

15voto

EMP Punkte 54832

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.

9voto

paxdiablo Punkte 809679

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).

0 Stimmen

Hier kommen Makros ins Spiel: assert kann im Debug-Modus einen Kern und im Release-Modus eine Ausnahme erzeugen :)

4voto

Smashery Punkte 53538

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);

6 Stimmen

(Falls sich jemand wundert, die Großbuchstaben ASSERT ist das Microsoft-Assert-Makro, und der Kleinbuchstabe assert ist Standard C.)

2voto

Igor Zevaka Punkte 71448

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.

0voto

Martin Beckett Punkte 92477

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.com

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.

Powered by:

X