Für Memory Leaks gibt es eigentlich nur einen Grund: Angeforderter (und bekommener) Speicher wird nicht mehr freigegeben (for whatever reason).
Oder hab ich was vergessen? Ich lerne immer noch gerne dazu!
Im Grunde ja, aber persönlich muss ich (auch aus eigener leidvoller erfahrung xD) sagen, dass es nicht immer so einfach ist.
Für alle die englisch können: https://blog.nelhage.com/post/three-kinds-of-leaks/
Typ 1: Klassischer Speicherleck
-> Speicher wird alloziiert aber nicht freigegeben.
Beispiel(e) c++:
In modernem c++ gibt es smart pointer, die bei solchen Problemen helfen, jedoch sind die mit zusätzlichen 'Kosten' verbunden, die man nicht überall gebrauchen kann.
Typ 2: fehlerhaftes/langsames Memory Management/Zu große Listen
-> Programm stürzt ab bevor Speicher freigegeben wird.
Beispiel(e) c++:
Kein gutes Beispiel aber Problem sollte klar sein.
Typ 3: Memory Fragmentation
-> Speicher ist theoretisch vorhanden, jedoch kann kein zusammenhängendes Stück alloziiert werden, welches groß genug ist.
Angenommen ich hab nurnoch unzusammenhängende Blöcke in meinem Addressraum von weniger als 1024Bytes und versuche 1025Bytes zu alloziieren.
=> egal wie viele solche Blöcke ich habe, selbst wenn alle genau 1024Bytes lang sind und zwischendrin jeweils nur 1 Byte belegt ist kommt es zu einer Out-of-Memory Exception.
1+2 sind vergleichsweise "einfach" zu beheben, sobald man sie gefunden hat (wobei das wort einfach relativ ist, je nach komplexität). Nummer 3 ist da schon etwas nerviger.
Mich würde nicht wundern, wenn das Problem von RoM eine Mischung all dieser Fehler ist.
Edith:
In Verbindung mit den Fehlern steht auch foglender:
<pre>
char* x = new char;
delete x;
delete x;
</pre>
=> ich darf nicht doppelt löschen (außer es handelt sich um nullpointer)