Autor Beitrag
Timboo89
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 06.05.12 17:16 
klingt als ob Du im Code so einer Stelle ohne korrespondierendes BMP.Free hast
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!