Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Memory Leak: Ursache finden (https://www.delphipraxis.net/173304-memory-leak-ursache-finden.html)

Klaus01 16. Feb 2013 18:35

AW: Memory Leak: Ursache finden
 
Zitat:

Zitat von Jazzman_Marburg (Beitrag 1203874)
Zitat:

Zitat von Union (Beitrag 1203869)
Versuch mal im destructor der Klasse ein
Delphi-Quellcode:
SetLength(fHfgkFarbe, 0)

Keinerlei Wirkung -- ReportMemoryLeak ("37-44 Bytes: Unknown x 1") unverändert.
Delphi-Quellcode:
destructor TPaletto.Destroy;
begin

 
  SetLength(fHfgkFarbe, 0);
  inherited Destroy;
end;
Danke!

.. und wenn Du inherited Destroy als letztes aufrufst?

Grüße
Klaus

Union 16. Feb 2013 18:38

AW: Memory Leak: Ursache finden
 
Und so?
Delphi-Quellcode:
destructor TPaletto.Destroy;
begin
  SetLength(fHfgkFarbe, 0);
  fHfgkFarbe := nil;
  inherited Destroy;
end;

Sir Rufo 16. Feb 2013 18:52

AW: Memory Leak: Ursache finden
 
Ein Array (dynamisch oder statisch) muss nicht freigeben werden. Das ist also mal nicht der Grund.

Delphi-Quellcode:
Unknown
(ganz alleine für sich) ist auch eher ein Hinweis auf einen mit
Delphi-Quellcode:
GetMem
/
Delphi-Quellcode:
AllocMem
allozierten Speicher-Bereich.

Sourcen möchtest du aber wohl hier nicht reinstellen?

Dann wird es schwierig, denn so ist das ein Blindflug

Jazzman_Marburg 16. Feb 2013 21:22

AW: Memory Leak: Ursache finden
 
Zitat:

Zitat von Union (Beitrag 1203876)
Und so?
Delphi-Quellcode:
destructor TPaletto.Destroy;
begin
  SetLength(fHfgkFarbe, 0);
  fHfgkFarbe := nil;
  inherited Destroy;
end;

Dito - exakt der selbe Leak-Report.

Zitat:

Zitat von Sir Rufo (Beitrag 1203877)
[...]
Delphi-Quellcode:
Unknown
(ganz alleine für sich) ist auch eher ein Hinweis auf einen mit
Delphi-Quellcode:
GetMem
/
Delphi-Quellcode:
AllocMem
allozierten Speicher-Bereich.

Sourcen möchtest du aber wohl hier nicht reinstellen?

Dann wird es schwierig, denn so ist das ein Blindflug

Ein explizites
Delphi-Quellcode:
GetMem
/
Delphi-Quellcode:
AllocMem
nutze ich nicht.

Sourcen wären im Prinzip überhaupt kein Problem -- aber es ist doch einiges an Code, und das wäre wirklich nicht ok, euch meinen Fehler im meinem Code suchen zu lassen. Sehr lieb!

Ich werde morgen einfach mal eine große Auskommentierungsaktion starten und mal systematisch rang gehen.

Ich bin nur ein wenig enttäuscht von MadExcept, so dass es mir wirklich gar kein Hinweis geben konnte. Ist technisch aber sicher auch nicht ganz einfach.

Vielen Dank an alle - super Truppe :thumb:

Gruß
Jazzman

EgonHugeist 16. Feb 2013 22:20

AW: Memory Leak: Ursache finden
 
StrNew(), ReallocMem() ???

Ist dein Project irgendwie FPC portable? Hier ist FPC Meilen vorraus mit deren HeapTracing. Hier kann man fast ganz exakt festsetellen, wo die MemLeaks "offen" bleiben und deren Ursache ergründen. Benutzt du noch eine Ansi-Delphi? Dann könnte die MemCheck.pas genauere Infos geben..

Union 17. Feb 2013 12:33

AW: Memory Leak: Ursache finden
 
Gibst Du das TPaletto Objekt denn überhaupt frei?

Uwe Raabe 17. Feb 2013 12:41

AW: Memory Leak: Ursache finden
 
Zitat:

Zitat von Union (Beitrag 1203954)
Gibst Du das TPaletto Objekt denn überhaupt frei?

Das wäre auch meine Frage: landest du überhaupt im Destroy?

Jazzman_Marburg 17. Feb 2013 14:05

AW: Memory Leak: Ursache finden
 
Problem gelöst! :-D

Wie schon alle Tools (und auch eure Hinweise) daraufhin deuteten, hing der Memory Leak mit dem Array of Integer zusammen:

Delphi-Quellcode:
FillChar( fHfgkFarbe, SizeOf( fHfgkFarbe ), 0);
Das Array wurde anschließend überhaupt nicht benutzt (stammt noch aus einer vorherigen Version), und genau diese Zeile sorgte für den Memory-Leak. Eine Recherche in einschlägigen Foren brachte dann auch den Hinweis, dass ein FillChar zum Initialisieren von Arrays nur mit Vorsicht zu benutzen ist.
Wenn ich nun das Array manuell mit Nullen initialisiere ist alles ok.
Wäre ja schon schön, wenn man eine "sichere" Methode hätte, Arrays mit Nullen zu füllen, wenn man schon FillChar nur unter bestimmten Umständen nutzen kann.

Aber das Problem ist gelöst, und ich danke allen Helfern!

Gruß
Jazzman

Union 17. Feb 2013 14:15

AW: Memory Leak: Ursache finden
 
Schön dass Du es gefunden hast. Initialierung bei einem dynamischen Array of integer wäre ja wohl eher:
Delphi-Quellcode:
FillChar( fHfgkFarbe, SizeOf(Integer) * Length(fHfgkFarbe), 0);

Blup 18. Feb 2013 17:00

AW: Memory Leak: Ursache finden
 
Variablen vom Typ eines dynamischen Arrays sind Zeiger auf den Speicher in dem die Array-Elemente liegen.
Delphi-Quellcode:
FillChar(fHfgkFarbe, {...}
Das ist falsch, so wird der Zeiger selbst überschrieben, nicht der Inhalt des Arrays.

Richtig so:
Delphi-Quellcode:
if Length(fHfgkFarbe) > 0 then
  FillChar(fHfgkFarbe[0], SizeOf(fHfgkFarbe[0]) * Length(fHfgkFarbe), 0);


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz