Memory leaks

Hallo,

mal ne blöde Frage, wie entsteht eigentlich ein Speicherloch? Ich habe mal testweise im VC++ 6 einen 30MB Speicher mit malloc() alloziiert und nicht wieder freigegeben, nach Beendigung des Programmes is er aber wieder freigegeben gewesen (konnte man schön im Taskmanager sehen).

Wie kann es also passieren, dass nach dem Beenden eines Programmes weniger Speicher existiert als vorher?

Oder mir fällt grad ein, was wäre passiert, wenn ich den Pointer, der auf die 30MB gezeigt hätte einfach auf NULL umgesetzt hätte oder so, wäre dann nichts freigegeben worden?

Bruno

Ich glaub das tritt ein wenn sich das Programm aufhängt. Ansonsten wird beim Beenden eines Prozesses wohl alles schon wieder freigegeben, sogar dynamisch allozierter Speicher. Probier mal eine Endlosscheife oder sowas zu machen im Test-Proggie nach dem der Speicher alloziert wurde und kille es dann mit dem Task Manager.

War „leider“ auch nicht erfolgreich … der Speicher wird wieder freigegeben beim abschiessen.
Auch ein Setzen des Pointers auf 0 bringt nichts, der findet den Speicher trotzdem :wink:

deswegen wundere ich mich warum es damit Probleme gibt und wenn man mal ein gößeres programm aufmacht und wieder zu kriegste fast nie den gesamten Speicher wieder zurück

Bruno

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

deswegen wundere ich mich warum es damit Probleme gibt und
wenn man mal ein gößeres programm aufmacht und wieder zu
kriegste fast nie den gesamten Speicher wieder zurück

Ja, das ist mir auch ein ewiges Raetsel. Netscape ist da ein ganz heisser Kandidat. Ich koennte mir Vorstellen, dass sowas beim Multithreading passieren kann, wissen tu ichs aber nicht. Ausserdem sollte der Speicher spaetestens dann wieder frei sein, wenn alle Threads weg sind, isser aber nicht. Tja … ich weiss auch nicht.

Gruss

Thorsten

deswegen wundere ich mich warum es damit Probleme gibt und
wenn man mal ein gößeres programm aufmacht und wieder zu
kriegste fast nie den gesamten Speicher wieder zurück

Bruno

Hi Bruno,
Du meinst unter Windows, da wird einfachd der Code des Programms im Speicher gehalten, falls das Programm kurze Zeit sp"ater wieder aufgerufen wird. Gleiches gilt f"ur dynamisch geladene Bibliotheken.

Das eigentliche Problem mit memory leaks ist, wenn ein Programm viele Objekte erzeugt, diese kurz benutzt und dann nicht wieder richtig zerst"ort, dann kann sich toter Speicher anh"aufen und am Ende aller Speicher belegt sein, obwohl die Gr"osse der aktiven Objekte relativ gering ist.

Da die Speicherbl"ocke aber dem Programm zugeordnet sind, werden diese bei Programmbeendigung vom Betriebssystem, der Prozessverwaltung, wieder freigegeben. Sollte diese ausgehebelt werden, hat man wohl auch einen BSOD (Blue Screen of Death).

Ciao Lutz