Gibt es eine Möglichkeit zu überprüfen, ob der Zeiger baumelt?

8

Ich habe einen Code, wo ich mit einem Zeiger auf einen Datenblock zugreifen kann. In einigen seltenen Fällen sind einige Mitglieder des Datenblocks leer, und der Zeiger wird dadurch schwankend. Tatsächlich bekomme ich den richtigen Zeiger, aber das Programm stürzt ab, wenn ich versuche, etwas mit dem Zeiger zu tun.

Der übliche Rat wäre, diese Art der Nutzung zu vermeiden. Aber leider erfordert das Framework, das ich verwende, dass ich diese Art von Datenzugriffsmethoden benutze.

Gibt es eine Möglichkeit, dass ich "überprüfen" kann, ob der Zeiger ungültig ist, bevor ich irgendeine Operation damit mache? Zu überprüfen, dass der Zeiger ungleich NULL ist, hat offensichtlich nicht funktioniert. Ich habe es auch versucht:

%Vor%

Ist es der richtige Weg?

    
Nikhil 05.10.2011, 09:24
quelle

4 Antworten

7

Ich denke, Sie schauen in die falsche Richtung. Sie haben wahrscheinlich einen Fehler, mit dem Sie die Zeiger nicht richtig initialisieren, die Objekte zu früh löschen und versuchen, den Zeiger wiederzuverwenden, nachdem er gelöscht wurde oder ähnliches. Wenn dies der Fall ist, sollten Sie sich darauf konzentrieren, herauszufinden, warum das passiert, und den Fehler beheben, anstatt zu versuchen, den Fehler zu verstecken.

Bei dem Ansatz, den Sie mit dem Operator typeid verwenden, lautet die Antwort, dass er nicht gültig ist. Für Objekte von Typen, die keine virtuellen Funktionen enthalten, wird der Operator typeid zur Kompilierzeit basierend auf dem statischen Typ des Zeigers aufgelöst. Bei Objekten, die mindestens eine virtuelle Funktion enthalten, wird sie zur Laufzeit aufgelöst, aber das Aufrufen von typeid(p) mit einem ungültigen Zeiger ist ein nicht definiertes Verhalten, und auf die gleiche Weise, wie es funktioniert, könnte es abstürzen.

Die Verwendung von Smartpointern, die vorgeschlagen wurde, hängt möglicherweise davon ab, was die Bibliothek tatsächlich tut und ob Sie die Smartpointer jederzeit weitergeben können oder nicht. Im Allgemeinen ist es eine gute Idee, intelligente Zeiger für die Speicherverwaltung zu verwenden, und das wiederum garantiert, dass die Zeiger korrekt initialisiert werden (beheben, wenn das Problem der Initialisierung ist) und weil Sie nicht mehr delete manuell setzen Das Problem ist, dass die Löschung zu einem früheren Zeitpunkt nicht mehr möglich ist. Beachten Sie jedoch, dass dies zwar das Problem lösen könnte, ich aber trotzdem denke, dass Sie verstehen müssen, warum der Zeiger in Ihrer Anwendung ungültig ist, da dies ein Symptom für ein größeres Problem sein könnte.

Nun zur ursprünglichen Frage, wie man überprüft, ob der Zeiger schwankt oder nicht, kann man das Programm nicht machen, aber man kann sein Programm innerhalb von Speicherdebuggern laufen lassen (Valgrind in Linux, Purify oder eine Menge anderer in linux) und das Tool kann Ihnen helfen zu bestimmen, ob der Zeiger nie initialisiert wurde, oder ob Sie den Speicher vor der falschen Verwendung freigegeben haben.

    
quelle
5

Es gibt keine Möglichkeit zu überprüfen, ob ein roher Zeiger gültig ist oder nicht. Ungültige Zeiger werden nicht garantiert, wenn sie auf sie zugreifen. Anstatt einen rohen Zeiger zu verwenden, müssen Sie einen intelligenten Zeiger verwenden.

    
David Heffernan 05.10.2011 09:25
quelle
3

Ja, Sie können intelligente Zeiger verwenden.

    
Septagram 05.10.2011 09:26
quelle
1

Sie benötigen keine intelligenten Zeiger. Sie sind nur ein möglicher Ansatz, um mit diesem Problem umzugehen.

Sie könnten reziproke Referenzen verwenden: Innerhalb des referenzierten Objekts (referencee) eine Liste von Referenzen zurück zu den Objekten, die darauf verweisen (references). Wenn es Zeit ist, die Referenz freizugeben, führen Sie zuerst die Liste der Referenzobjekte durch und setzen Sie alle Eigenschaften, auf die sie verweisen, auf Null, normalerweise auf null (normalerweise würden Sie vorher wissen wollen, welche Eigenschaft dies wäre), und nehmen Sie dann die Zuordnung wieder auf die Referenz.

    
Arcane Engineer 09.11.2014 15:41
quelle

Tags und Links