Wodurch kommen Memoryleaks zustande?
-
Mal so dahergefragt: Wie kommt sowas zustande? Wie kann man das grundsätzlich vermeiden bzw. vorhandene beseitigen?
-
Ein Leak kommt dadurch zustande dass man was anfordert/anlegt/holt und es dann nicht wieder freigibt/zerstört/zurückgibt. Ganz einfach.
Vermeiden tut man es indem man beim Programmieren aufpasst bzw. versucht soweit wie möglich das "freigeben" zu automatisieren.
Und beseitigen tut man Leaks indem man den Fehler behebt der dazu führt dass irgendwas nicht freigegeben wird.
-
smart_pointer könnte man hier auch mal in die Runde werfen

-
Was mir zu dem Thema noch immer nicht ganz klar geworden ist:
Nach meinem Wissen müsste der Heap nach beendigung des Programmes wieder aufgeräumt sein, kein fehlendes delete am Programmende egal sein.
In den diskussionen scheint es aber als ob nicht freigegebener Speicher für immer (bis zum reboot) "verlohren" ist.
Was stimmt jetzt?
-
Hallo
Das kommt drauf an. Unter altem 16-bit DOS war das auch der Fall.
Aber unter modernen Bestriebssystem passt das OS auf den Speicher auf. Wenn ein Programm geschlosssen wird, wird grundsätzlich aller zu dem Programm gehörenden Speicher freigegeben.
Ausnahmen gibts bei anderen Ressourcen wie Exklusivzugriffe auf Dateien.bis bald
akari
-
Also sollte man Variablen, Objekte usw. die Speicher zugewiesen bekommen haben immer wenn sie nicht mehr benötigt werden wieder freigeben/zerstören. Welche Techniken, Methoden sind für die jeweiligen Objekte zuständig oder am besten geeignet?
Werden denn beispielsweise Variablen, wenn sie aus dem Sichtbarkeitsbereich raus sind nicht automatisch freigegeben?
-
Um alles was du auf dem Stack anlegst brauchst du dich nicht kümmern. Alles auf dem Head angelegt wird (mit new) muss auch wieder von dir (mit delete) gelöscht werden.
-
Gilt dies auch für arrays? Wie wird das dort gemacht? Gibts ein konkretes Beispiel?
-
Hallo
Für Arrays gilt das gleiche, außer das für new[] auch delete[] benutzt werden muß. Zu dynamischen Arrays gibts außerdem schon genug Threads hier.
bis bald
akari
-
Nicht virtuelle dtors
-
Hallo
Du kannst auch bei codeproject mal nach visual leak detectos schauen. damit kannst du sehr leicht nach leaks suchen.
chrische
-
Ford P schrieb:
Um alles was du auf dem Stack anlegst brauchst du dich nicht kümmern. Alles auf dem Head angelegt wird (mit new) muss auch wieder von dir (mit delete) gelöscht werden.
Aus welchem Grund sollte man denn dann new benutzen? Mir scheint, als würde man sich die Arbeit damit nur erschweren
.
-
Wenn du z.B nicht im voraus weiszt wieviel Speicher du brauchst.
-
Shinja schrieb:
Wenn du z.B nicht im voraus weiszt wieviel Speicher du brauchst.
Was soll ich mir darunter vorstellen? Wenn ich ein Programm ohne new und delete schreibe, dann gebe ich doch auch nirgends an, wieviel Speicher ich brauche. Und bei Arrays kann man doch einen Vector oder sowas in der Art nehmen, wenn es dynamisch sein soll.
-
Und womit arbeitet ein vector wohl?
Richtig, mit new und delete.
-
Shinja schrieb:
Und womit arbeitet ein vector wohl?
Richtig, mit new und delete.Ja, aber darum muss ich mich doch nicht kümmern.
-
"Wenn ich ein Programm ohne new und delete schreibe"
sobald du nen vector benutzt, stimmt die aussage ja nicht mehr. dann hast du new/delete verwendet, wenn auch indirekt.
-
sobald du aber nicht kopierbare oder abstrakte Objekte in einem Vector speichern willst, kommst du nicht um new/delete herum (musst sie ja als Zeiger speichern und vorher auf dem Heap allozieren), da helfen aber auch referenzzaehlende smart pointer gegen das Vergessen.
-
basti33 schrieb:
...Aus welchem Grund sollte man denn dann new benutzen?...
Neben der schon erwähnten "Bestimmung der Objektgröße/Anzahl zur Laufzeit" dallen mir noch 2 Argumente ein:
- Scopes: Wenn Dein Objekt außerhalb Deines Scopes (z.B. Factoryklasse) weiterleben soll, kommst Du ohne new nicht weiter.
- Laufzeitpolymorphie: Wenn Du unterschiedliche "Kinder einer Basis" gleich behandeln möchtest, ist das oftmals mit Heapobjekten einfacher (nud manchmal nur so sinnvoll möglich).
Zusammen kommen die beiden Aspekte, wenn Du mehrere Objekte polymorph in einem vector ablegen möchtest...Gruß,
Simon2.