Tips um Speicherlecks zu vermeiden?
-
Hallo zusammen,
ihr kennt das sicher, wenn man Anwendungen entwickelt tritt bei der Einen oder Anderen gern mal ein Speicherleck auf. Im Debugger sieht das dann so aus:
{375} normal block at 0x018CF4D0, 20 bytes long. Data: < 2| > D8 9C 32 7C 03 00 00 00 03 00 00 00 01 00 00 00
Zwar scheinen diese Meldungen und Lecks den Programmablauf nicht merklich zu beeinträchtigen, aber trotzdem... mich stört das!
Nun mir ist aufgefallen das sich solche Speicherlecks in meinen Anwendungen gerne mal "einschleichen", bzw. "eingeschlichen wurden".
Gibt es ein paar allgemeine Tips, wie man Speicherlecks am besten vermeidet und wie man sie in einer fertigen Anwendung nachträglich lokalisiert?
Und kann mir jemand eigentlich mal erklären was auf Dauer passiert/passieren könnte, wenn diese Speicherlecks nicht beseitigt werden?Ist nur ne reine Frage aus Neugier, wäre trotzdem nett wenn es ein paar Antworten regnet.
Vielen Dank,
Julian
-
Das ist ganz böse wenn Du so etwas ignorierst!
Es ist wahrscheinlich so das Du irgendwo Speicher vom BetriebsSystem
angefordert hast und hast ihn nicht wieder freigegeben. Böse böse....Falls der Rechner dann irgendwann abstürzt dann machste Dich auf die Suche
oder???Oder du hast etwas vorbereitet:
-
Hallo,
Falls der Rechner dann irgendwann abstürzt dann machste Dich auf die Suche
oder???Spätestens dann ja ;), aber nein ich habe es gesehen und wollte einfach mal fragen wie ich sowas im allgemeinen verhindern kann.
Und vielen Danke für den Link, ist wirklich sau interessant.
LG
-
Z.B. mit meinem LeakFinder:
http://www.codeproject.com/KB/applications/leakfinder.aspx
Die aktuelle Version liegt aber hier:
http://blog.kalmbachnet.de/files/LeakFinder-RC8.zip
-
BTW: Wenn ein
#define new DEBUG_NEW
gesetzt würde, dann würde Dir das System sogar die Zeile und die Sourcedatei ausgeben in der der Leak erzeugt wurde.
-
Moin,
allgemein gesagt kann man Leaks verhindern indem man jeden angeforderten Speicher auch wieder freigibt, wenn man ihn nicht mehr braucht.
Das war sehr allgemein
Konkret heißt dass z.B. für jedes mal wenn du "new" verwendest, musst du auch irgendwo ein "delete" aufrufen. Oder wenn du dir dynamisch Speicher allokierst, muss dieser zwangsläufig wieder freigeben werden ... .
Leaks sind eine fiese Sache und sie können dein Programm oder den ganzen Rechner zum Absturz bringen. Dein Programm reserviert nämlich immer munter Arbeitsspeicher und dem Betriebssystem gehen die Ressourcen irgendwann aus. Die Folgen kannst du dir dann ausmalen. Bei kleinen Programmen, die nicht lange laufen merkt man Leaks heutzutage nicht mehr und es scheint alles gut zu funktionieren. Aber bei Programmen die große Datenmengen verarbeiten(Videos beispielsweise) ist der Speicher ganz schnell voll und das Programm stürzt ab, obwohl deine Algorithmen richtig sind. Ein noch schlimmeres Szenario sind Webanwendungen. Stell Dir vor, ein Emailserver mit wenigen 100000 Usern müllt seinen Speicher voll. Dann musst du alle paar Tage den Service oder gar den ganzen Server abschalten und neustarten. Dabei können dann Daten verloren gehen und Mails können nicht verschickt werden... und deine Kunden sind ganz schnell verärgert.
Nimm MemoryLeaks nicht auf die leichte Schulter, die machen dein Programm instabil. Du kannst die oben genannten Programme nutzen um die Leaks zu finden, aber meistens reicht es schon sich genau den Code anzuschauen.Gruß Andi
-
@ Jochen: Der LeakFinder ist genial, vielen Dank dafür.
@ Martin: Das werd ich mir zu Herzen nehmen, danke.@Andi: Klasse, vielen Dank für deinen Beitrag, ich werd sofort meine aktuellen Projekte durchsuchen
.
Ich nehme Leaks nicht auf die leichte Schulter, klang vielleicht oben so. Es ist eher so das ich sie vermeiden möchte, bzw. lokalisieren und eliminieren. Und dank der Hilfe von euch vieren wird das super gelingen.Nochmals vielen vielen Dank an euch und ich weiß ja nicht aber vielleicht aufgrund von LeakFinder & Co. was für die FAQ?
Liebe Grüße,
Julian
-
RAII ist auch nicht zu verachten, um solche Fälle zu vermeiden. Durch einfache smart-pointer für Zeiger in deinem Zuständigkeitsbereich direkt wenn sie diesen "betreten" lässt sich da schon viel erreichen
Wikipedia hat sogar einen Artikel dazu
-
Am besten man verwendet smarte Klassen die von selbst die Zeiger freigeben. Sprich: new vermeiden oder eben Smart-Ptr verwenden.