AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Leak: Ursache finden

Ein Thema von Jazzman_Marburg · begonnen am 16. Feb 2013 · letzter Beitrag vom 1. Mär 2013
Antwort Antwort
Seite 2 von 3     12 3      
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Memory Leak: Ursache finden

  Alt 16. Feb 2013, 19:35
Versuch mal im destructor der Klasse ein 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: Memory Leak: Ursache finden

  Alt 16. Feb 2013, 19:38
Und so?
Delphi-Quellcode:
destructor TPaletto.Destroy;
begin
  SetLength(fHfgkFarbe, 0);
  fHfgkFarbe := nil;
  inherited Destroy;
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Memory Leak: Ursache finden

  Alt 16. Feb 2013, 19:52
Ein Array (dynamisch oder statisch) muss nicht freigeben werden. Das ist also mal nicht der Grund.

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

Sourcen möchtest du aber wohl hier nicht reinstellen?

Dann wird es schwierig, denn so ist das ein Blindflug
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#14

AW: Memory Leak: Ursache finden

  Alt 16. Feb 2013, 22:22
Und so?
Delphi-Quellcode:
destructor TPaletto.Destroy;
begin
  SetLength(fHfgkFarbe, 0);
  fHfgkFarbe := nil;
  inherited Destroy;
end;
Dito - exakt der selbe Leak-Report.

[...]
Unknown (ganz alleine für sich) ist auch eher ein Hinweis auf einen mit GetMem /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 GetMem /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

Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

AW: Memory Leak: Ursache finden

  Alt 16. Feb 2013, 23:20
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..
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#16

AW: Memory Leak: Ursache finden

  Alt 17. Feb 2013, 13:33
Gibst Du das TPaletto Objekt denn überhaupt frei?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#17

AW: Memory Leak: Ursache finden

  Alt 17. Feb 2013, 13:41
Gibst Du das TPaletto Objekt denn überhaupt frei?
Das wäre auch meine Frage: landest du überhaupt im Destroy?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#18

AW: Memory Leak: Ursache finden

  Alt 17. Feb 2013, 15:05
Problem gelöst!

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

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
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#19

AW: Memory Leak: Ursache finden

  Alt 17. Feb 2013, 15:15
Schön dass Du es gefunden hast. Initialierung bei einem dynamischen Array of integer wäre ja wohl eher:
FillChar( fHfgkFarbe, SizeOf(Integer) * Length(fHfgkFarbe), 0);
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#20

AW: Memory Leak: Ursache finden

  Alt 18. Feb 2013, 18:00
Variablen vom Typ eines dynamischen Arrays sind Zeiger auf den Speicher in dem die Array-Elemente liegen.
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);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
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