Autor |
Beitrag |
Timboo89
Hält's aus hier
Beiträge: 4
|
Verfasst: So 06.05.12 15:00
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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); |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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?
_________________ We are, we were and will not be.
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: So 06.05.12 18:15
Moin...
erst mal Willkommen hier
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 ?
Zeige doch mal deinen relevanten Quelltext...dann schauen wir mal 
|
|
Timboo89 
Hält's aus hier
Beiträge: 4
|
Verfasst: So 06.05.12 19:31
Zitat: | Zeige doch mal deinen relevanten Quelltext...dann schauen wir mal  |
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 Narses: Beiträge zusammengefasstIch 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
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: 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.  Ich bin dann mal weg !
|
|
Timboo89 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 07.05.12 10:47
Einloggen, um Attachments anzusehen!
|
|