Speicherzugriffsfehler
-
Servus,
ich hab ein größeres Programm. Es läuft eigentlich wie es soll. Nachdem ich das Programm beendet habe bekomme ich eine Meldung:
14165 Speicherzugriffsfehler
Jetzt weiss ich nicht weiter. Ich arbeite unter Suse 9.3 und habe gelesen, dass man fürs Debugging z.B. ddd verwenden kann.
Wie kann ich an ein solches Problem herangehen? Ich weiss ja über den Fehler eigentlich überhaupt nichts...
Gibts da einen Trick/eine spezielle Vorgehensweise?Gruss, KB
-
eventuell hast du nicht richtig aufgeräumt oder benötigst beim Beenden noch irgendeinen Pointer den du schon gelöscht oder auf null gesetzt hast?
-
ddd ist eines der zahlreichen Frontends für den GDB. Schau aber mal, vielleicht ist in deiner Entwicklungs-Umgebung bereits ein GDB Frontend eingebaut.
Ansonsten ist valgrind ideal um Fehler in der Speicherverwaltung zu finden.
-
@kingruedi: den ddd hab ich bereits auf meinem system und konnte den immerhin mal ohne probleme starten. ist ein umstieg für mein problem nötig? ich denke (hoffe) mal nicht...
@DocJunioR: genau das ist könnte ich mir vorstellen. das programm ist allerdings ziemlich umfangreich und für mich noch nicht richtig zugänglich. ich soll den fehler suchen. meine frage wäre nun also, wie würde man solche fehler finden? geht das nur "von hand" indem man den source manuell durchschaut oder gibts da tools / debugger funktionen oder sonstwas?
Gruss, KB
-
Ich würde Dir dringend empfehlen, alle Pointer nach dem Löschen des darauf verweisenden Speichers mit NULL zu belegen. Dann kannst du vor jedem delete mit "if (... != NULL) schauen, ob Du den Speicher nicht schon freigegeben hast.
Hth, Joe
-
Die Funktion assert(Bedingung) ist auch sehr nützlich zum Debuggen.
Wenn die Bedingung nicht erfüllt ist, steigt das Programm aus und gibt dir die Zeilennummer an. (Wenn du für Debug kompiliert hast).
-
Hmm ... ich kann nichts finden.
Was kann denn so einen Fehler verursachen?14165 Speicherzugriffsfehler
Soweit ich weiss, ist das zwar nicht schön gemacht, aber wenn ich einen Pointer nicht auf NULL setze bevor die Funktion beendet wird, dann wird doch nicht gemeckert, oder?
Speicherzugriffsfehler gibts doch, wenn auf Speicher zugegriffen wird, der nicht reserviert wurde?Gruss, KB
-
Die Möglichkeiten sind grenzenlos.
- ungültiger Array-Index
- anderweitiger Fehler in deiner Pointer-Arithmetik
- Objekte mehrmals löschen
- auf gelöschte Objekte zugreifen
- 0-Zeiger dereferenzieren
- 10 Mio. weitere MöglichkeitenDu kommst nicht drum herum, die Bedienung eines Debuggers deiner Wahl zu lernen.
-
joerider schrieb:
Dann kannst du vor jedem delete mit "if (... != NULL) schauen, ob Du den Speicher nicht schon freigegeben hast.
ein 0-Pointer zu deleten ist absolut legal. Interessanter wäre es wie gesagt so etwas wie efence oder valgrind zu benutzen.
@Karl Blau
Ist egal welches Frontend du benutzt. Aber für Speicherfehler lohnt sich wie gesagt etwas wie efence oder valgrind eher, da der gdb nur ein normaler Debugger ist.