Ja, es gibt ein Problem mit Zeigern. Sehr wahrscheinlich verwenden Sie eine, die nicht richtig initialisiert wurde, aber es ist auch möglich, dass Sie Ihre Speicherverwaltung mit doppelten Freigaben oder Ähnlichem durcheinander bringen.
Um nicht initialisierte Zeiger als lokale Variablen zu vermeiden, versuchen Sie, sie so spät wie möglich zu deklarieren, vorzugsweise (und dies ist nicht immer möglich), wenn sie mit einem aussagekräftigen Wert initialisiert werden können. Überzeugen Sie sich selbst, dass sie einen Wert haben, bevor sie verwendet werden, indem Sie den Code untersuchen. Wenn Sie damit Schwierigkeiten haben, initialisieren Sie sie mit einer Nullzeigerkonstante (normalerweise als NULL
oder geschrieben 0
) und überprüfen Sie sie.
Um nicht initialisierte Zeiger als Elementwerte zu vermeiden, stellen Sie sicher, dass sie im Konstruktor ordnungsgemäß initialisiert und in Kopierkonstruktoren und Zuweisungsoperatoren ordnungsgemäß behandelt werden. Verlassen Sie sich nicht auf eineinit
bei der Speicherverwaltung Funktion, auch bei anderen Initialisierungen.
Wenn Ihre Klasse keine Kopierkonstruktoren oder Zuweisungsoperatoren benötigt, können Sie diese als private Elementfunktionen deklarieren und niemals definieren. Dies führt zu einem Compilerfehler, wenn diese explizit oder implizit verwendet werden.
Verwenden Sie gegebenenfalls intelligente Zeiger. Der große Vorteil dabei ist, dass Sie das Schreiben vollständig vermeiden können, wenn Sie sich an sie halten und sie konsequent verwenden, delete
und nichts wird doppelt gelöscht.
Verwenden Sie nach Möglichkeit C ++ - Zeichenfolgen und Containerklassen anstelle von Zeichenfolgen und Arrays im C-Stil. Verwenden Sie .at(i)
lieber als [i]
, da dies die Überprüfung der Grenzen erzwingt. Überprüfen Sie, ob Ihr Compiler oder Ihre Bibliothek so eingestellt werden kann, dass die Grenzen überprüft werden[i]
zumindest im Debug-Modus werden. Segmentierungsfehler können durch Pufferüberläufe verursacht werden, die Müll über einwandfreie Zeiger schreiben.
Dadurch wird die Wahrscheinlichkeit von Segmentierungsfehlern und anderen Speicherproblemen erheblich verringert. Sie werden zweifellos nicht in der Lage sein, alles zu reparieren, und deshalb sollten Sie ab und zu Valgrind verwenden, wenn Sie keine Probleme haben, und Valgrind und GDB, wenn Sie dies tun.
g
im Kontext von kompilieren zu lassenCMake
?