Speicherlecks / Speicheroptimiereung - Wie geht man vor ?
-
Hallo ich habe ein kleine Programm, welches eine oline Galerie samt Thumbnails anzeigt mit und zur verwaltung bereitstellt.
Mein Problem :
Es entstehen Speicherlecks, so das bei vielen Bilder, häufigen Galerieauslesen der Speicher ausgeht. ich möchte natürlich, dass die nicht geschiet.Prinzipell gilt die Faustregel, das alle nicht VCL variablen nach beenden einer Funktion(Variablen die in einer Funktion deklariert wurden) gelöscht/deren Speicher freigegeben wird.
Bei VCL Komponenten muss man mit "delete" dafür sorgen, dass deren Destructor aufgerufen wird und somit der Speicher freigegebn wird.
Ich denke ich habe das befolgt und soweit kann ich dort keinen offensichtlichen fehler entdecken.
Frage :
Hat jemand spezielle Tips/techniken mit denen man Effektiv festellen kann, wo Speicherlecks auftreten um diese zu lokalisieren ?
Gibt es Punkte/Strukturen, bei denen oft vergessen wird, den Speicher freizugeben ? Praktisch typisch fehler ?Vielen Dank
-
Hallo
CodeGuard
(ist zwar nicht alles was es gibt, aber ein Anfang)MfG
Klaus
-
Hallo
und zusätzlich noch zur Laufzeit eine Logdatei erstellen, um einzelne Funktionsaufrufe (hier : new und delete) aufzuzeichnen.
bis bald
akari
-
Hmm werd mir beides anschauen aber folgende Frage :
Ich denke besonders mit den Array hab ich ein Problem.
DynamicArray<AnsiString> myvar;
Diesen Array als property in einer Classe "freigeben"/zurücksetzen.
Reich da ein
myvar.Length = 0;Wenn ich eine VCL klasse darin habe geh ich den array stück für stück durch und führe die destructoren aus.
btw. gibt es den CodGourd mit dem BC5++ pers ?
Danke
-
@ Akari: wie erstellt man sinnvoll solche Logdateien????
Wäre für ein einfaches Beispiel mit erklärung vielleicht dankbar!
-
Speicherleg? schrieb:
@ Akari: wie erstellt man sinnvoll solche Logdateien????
Wäre für ein einfaches Beispiel mit erklärung vielleicht dankbar!
Dazu nimmst du am einfachsten TFileStream.
Damit öffnest du beim Start deines Programms mit TFileStream eine Datei zum Schreiben. Bei jedem dir wichtigen Ereigniss schreibst du die Nachricht im Schemaaktuelle Systemzeit <Tab> Nachricht <Zeilenende>Am ende des Pogramms löscht du das Stream-Objekt.
Wenn du dann ein VCL-Control erstellst, schreibst du eine Nachricht :
Konstruktor für <Control-Name>,<Control-Owner>beim Löschen eines Controls
Destruktor für <Control-Name>,<Control-Owner>dann weißt du genau, welche Controls du nicht löscht.
Es gibt dann noch die Möglichkeit, new und delete zu überladen, um dort direkt den Ablauf zu loggen. Dazu gibt es irgendwo einen Thread im C++ Forumbis bald
akari
-
maYer schrieb:
DynamicArray<AnsiString> myvar;
dafür gibt es TStringList!
maYer schrieb:
Wenn ich eine VCL klasse darin habe geh ich den array stück für stück durch und führe die destructoren aus.
dafür würde ich TList verwenden und nur die zeiger auf die objekte speichern.
-
Es gibt desweiteren noch TObjectList und TComponentList. Die hab ich zwar noch nie verwendet, in der Hilfe steht aber, dass diese Listen sich auch um den Speicher ihrer Objekte kümmern.
-
ich verwende memproof.
das zeigt dir schön wieviel speicher reserviert wurde und wieviel davon wieder freigegeben wird. in der vcl sind auch einige lecks drin. wenn du das ganze im debugmodus testet, dann bekommst du die objekte angezeigt, bei denen es klemmt.
-
-
ausprobieren! bei mir schon.
-
Alles klar,
also grundsätzlich keine DynamicArray verwenden?
Ich meine es ist bei mir oft nicht zu ersetzen, weil die Array Teilweise 3 Dimensionen haben.Die Fehler in meinem Fall hab ich schon fast alle gefunden. Zum größten teil VCL-Kompos aus Properties von selbstgeschriebenen Klassen, die im DEstruktor nicht gelöscht wurden und solche Dinge. Da sollte man aufpassen.
Werd mir alles einemal anschauen, vielen Dank.
-
DynamicArray ist lahm. Wozu braucht man ein dynamisches dreidimensionales Array?
Fuer solche Sachen schreib ich mir immer ne eigene Klasse.
-
Klar, kann ich dafür eine Struktur schreiben, aber bei simplen sachen lohnt das nicht immer.
Wenn es jedoch speicherlecks gibt, werde ich es möglichst unterlassen.Danke euch