Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Speicherlecks durch Delphi?


Timboo89 - So 06.05.12 15:00
Titel: Speicherlecks durch Delphi?
Hi, ich habe in meinem Programm einige Speicherlecks, die meines Wissens nach nicht durch mich verschuldet sind.
Ich habe mir einen eigenen Speicherzähler angelegt, der bei jedem Aufruf von new und dispose incrementiert/decrementiert wird. Dieser ist am Ende auch 0. Delphi allerdings (durch Eingabe von System.ReportMemoryLeaksOnShutdown := true) zählt mir einige Lecks auf:

---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

13 - 20 bytes: TList x 1
21 - 28 bytes: TBrush x 1
29 - 36 bytes: TPen x 1, Unknown x 2
37 - 44 bytes: TFont x 1
61 - 68 bytes: TBitmap x 1
101 - 108 bytes: TBitmapCanvas x 1
117 - 124 bytes: TBitmapImage x 1
141 - 148 bytes: TImageList x 1
157 - 172 bytes: Unknown x 1

---------------------------
OK
---------------------------

TBrush aber zum Beispiel benutze ich NIEMALS in meinem Programm (ausser als Instanz von TBitmap).

Jemand eine Idee woran das liegen kann und wie ich die weg kriege?

MfG Timo


bummi - So 06.05.12 17:16

klingt als ob Du im Code so einer Stelle ohne korrespondierendes BMP.Free hast

Delphi-Quelltext
1:
2:
3:
4:
5:
var
 bmp:TBitmap;
begin
 bmp := TBitMap.Create;
 Imagelist1.GetBitmap(0,bmp);


Gausi - So 06.05.12 17:42

Erzeugst du die ImageList zur Laufzeit und hast vergessen, den Owner (eine Form) anzugeben, die sich beim Schließen um das Löschen dieser Liste kümmert?


haentschman - So 06.05.12 18:15

Moin...

erst mal Willkommen hier :welcome:

Zitat:
Ich habe mir einen eigenen Speicherzähler angelegt, der bei jedem Aufruf von new und dispose incrementiert/decrementiert wird. Dieser ist am Ende auch 0.

Was hat das für einen Grund ? :gruebel:
Zeige doch mal deinen relevanten Quelltext...dann schauen wir mal 8)


Timboo89 - So 06.05.12 19:31

Zitat:
Zeige doch mal deinen relevanten Quelltext...dann schauen wir mal 8)

Wenn ich wüsste an welcher Stelle das Problem liegt, müsste ich nicht fragen ;) leider ist Delphi da ja keine besondere Hilfe.

Zitat:
Erzeugst du die ImageList zur Laufzeit und hast vergessen, den Owner (eine Form) anzugeben, die sich beim Schließen um das Löschen dieser Liste kümmert?

Der Owner der ImageList ist die Form.. leider.

Das von Bummi werd ich gleich mal durchsehen


Danke schon Mal

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Ich sehe gerade, dass eine meiner Bilderlisten mit "CreateSize" erstellt wurde und damit keinen Owner zugewiesen bekommen habe. Freigegeben habe ich die Liste aktuell nur mit Free, sollte doch eigentlich reichen?! Oder ist Embercado mal wieder überfordert mit dem Haufen an nicht funktionierenden Funktionen ihrer Programmiersprache?


haentschman - So 06.05.12 20:03

Zitat:
Oder ist Embercado mal wieder überfordert mit dem Haufen an nicht funktionierenden Funktionen ihrer Programmiersprache?
...starker Tobak anderen die Schuld für seine eigenen Unzulänglichkeiten zu geben. :roll: Ich bin dann mal weg !


Timboo89 - So 06.05.12 20:13

Ich meine damit nicht, dass die Schuld daran sind, dass ich nicht jeden Speicher richtig freigebe. Ich meine damit den Haufen an Funktionen, die nicht funktionieren. Oder jedenfalls funktionsweisen, die in früheren Versionen noch funktioniert haben und nun anders umgesetzt wurden und damit eben nicht mehr wie gewohnt funktionieren. Das halte ich für nicht besonders benutzerfreundlich ;) auch wenn man unter Programmierern ist. Ich für meinen Teil stelle viel zu oft dererlei Missgeschicke bei Embercado fest.


jaenicke - So 06.05.12 20:55

Das liegt oft eher daran, dass der alte Quelltext nicht sauber geschrieben war, denn "es funktioniert ja". Dabei haben sich viele einfach auf Interna verlassen, die nie offiziell dokumentiert waren (z.B. Length(String) = Größe in Byte, das war nie so gedacht, haben aber viele einfach vorausgesetzt). Dass sich sowas dann ändern kann, sollte jedem klar sein. Bei den dokumentierten Funktionen wurde leider ein wenig zu oft versucht die Abwärtskompatibilität auf Biegen und Brechen zu erhalten. Sonst gäbe es heute nicht so viele Krücken...

Auf welche Änderungen beziehst du dich denn konkret?

Wo das Problem in deinem Programm genau liegt, sollte sich mit FastMM im FullDebugMode leicht herausfinden lassen, da du damit den Stacktrace der Stellen bekommst, an denen der Speicher reserviert wurde, der da leakt.


Delphi-Laie - So 06.05.12 21:11

Ohne Tiefenkenntnisse, sondern nur mit Amateurkenntnissen, gebe ich jaenicke recht (das bedeutet aber nicht, daß ich vermute, daß ich ihm als Informatiker widerspräche). Delphi hat eine bemerkenswerte Abwärtskompatibilität durchgehalten. Delphi-1-Quelltexte sind n.m.W. auch in die neuen/letzten Delphiversionen minimalen oder schlimmstenfalls ohne allzugroße Anpassungsbedarf übernehmbar, ab Delphi 2 teilweise vielleicht sogar ohne Änderungen compilierbar. Diese weite und lange Abwärtskompatibilität ist eine in der Computergeschichte ziemlich seltene Kontinuität, die natürlich auch ihren "Preis" hat, und natürlich einer der Gründe für den Erfolg.


Timboo89 - Mo 07.05.12 09:42

Ja, ich muss zugeben, ich arbeite lieber in C++ oder Java. Ich habs lieber, wenn die Laufzeitumgebung sich entweder GAR NICHT oder vollkommen um Speicherfreigabe kümmert =) Ich hoffe also, dass sich niemand auf den Schlips getreten fühlt, dass ich nicht so der Delphi-Fan bin =) Jeder hat halt seine eigene programmierweise =)

Aber zurück zum Thema:
Kann mir einer ein "einfach" verständliches Tutorial zu FastMM nennen? Die, die ich gerade finde zeigen den Installationsweg und Nutzungsweg nicht wirklich. Nur was man mit dem Ergebnis anfangen kann.

Danke nochmals =)


jaenicke - Mo 07.05.12 10:47

user profile iconTimboo89 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habs lieber, wenn die Laufzeitumgebung sich entweder GAR NICHT oder vollkommen um Speicherfreigabe kümmert =)
Ich behalte lieber selbst die Kontrolle, auch wenn ich es von C# und Java durchaus gewohnt bin, dass es dort anders ist. Besser finde ich das aber nicht unbedingt, auch wenn die eigene Faulheit das anders sieht. ;-)

user profile iconTimboo89 hat folgendes geschrieben Zum zitierten Posting springen:
Kann mir einer ein "einfach" verständliches Tutorial zu FastMM nennen? Die, die ich gerade finde zeigen den Installationsweg und Nutzungsweg nicht wirklich. Nur was man mit dem Ergebnis anfangen kann.
Da ist auch nicht viel zu tun. In der FastMM4Options.inc den FullDebugMode aktivieren, die entsprechende DLL aus dem Unterverzeichnis in das deiner Anwendung kopieren und die FastMM4 als erste in den Projektquelltext einbinden, fertig. ;-)
Meine .inc Datei liegt im Anhang, du kannst auch einfach die nehmen.