Seite 1 von 1
Memory leaks
Verfasst: So Okt 14, 2012 8:25 am
von Kmitska
Hallo Leute,
meine Frage ist kurz und deutlich glaube ich:
Ich habe mal mein Programm mit "top" beobachtet, und dabei stellte ich fest, dass mein Programm irgendwo speicher reserviert aber nicht frei gibt.
Nun die Frage: Gibt es da irgendwleche Methoden solche Fehler zu finden?
Ich arbeite unter Ubuntu (Linux) und benutze Code::Blocks als IDE.
Danke im Voraus.
Re: Memory leaks
Verfasst: So Okt 14, 2012 10:53 pm
von Xin
Kmitska hat geschrieben:Nun die Frage: Gibt es da irgendwleche Methoden solche Fehler zu finden?
Ich habe unter C früher eigene Alloc und Free-Funktionen benutzt. Heute würde ich operator new und delete mit einem Macro ersetzen.
Für den Speicher habe ich dann einen Grund angegeben, wo und warum ich Speicher angefordert habe. Diese Zeiger habe ich in eine statische Liste eingesetzt und beim Löschen dort wieder entfernt.
Am Ende des Programms habe ich mir ausgeben lassen, was ich nicht freigegeben habe.
Heute kannst Du dies auch mit Valgrind lösen - dafür fehlt Dir natürlich da die Begründung, aber die ergibt sich in der Regel aus der Position im Quelltest.
Re: Memory leaks
Verfasst: Di Okt 16, 2012 9:16 am
von Chris
Die eben beschriebene Methode habe ich auch schon oft gesehen. Wenn es nicht ganz so detailliert sein soll, kann man auch einfach einen Zähler mitlaufen lassen. Dieser wird dann beim Anfordern inkrementiert und beim Freilassen dekrementiert. Am Ende des Programms muss dann 0 raus kommen, ansonsten wurde etwas nicht freigegeben. Um die genaue Position im Quellcode ausfindig zu machen, ist die Methode von Xin natürlich aller erste Sahne.
Re: Memory leaks
Verfasst: Mi Okt 17, 2012 1:26 pm
von oenone
Zur Analyse, welcher Speicher nicht freigegeben wird, kann das Programm
valgrind benutzt werden. Sollte sich im Ubuntu-Repository befinden. Dein Executable einfach als Parameter angeben:
valgrind ./meinprog und dann die Zusammenfassung lesen. Da gibt es dann auch Tipps, wie du genauere Informationen herausbekommen kannst.
Und immer schön die Debugsymbole drin lassen
