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 3 von 3     123   
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#21

AW: Memory Leak: Ursache finden

  Alt 22. Feb 2013, 16:20
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.
Je mehr man auf Klassen setzt, umso leichter wird die Fehlersuche.
Man kann z.B. dynamischee Arrays direkt in der Anwendung, der "Businesslogik", benützen.
Oder man kapselt das Array innerhalb einer Klasse und lässt nur einen kontrollierten Zugriff über die Methoden der Klasse zu.
Insbeondere sollte man Resourcen (Speicher ist auch eine Resource) immer unter die Kontrolle einer Klasse stellen.
Das heisst dann konkret, dass AllocMem und FreeMem nur im geschützten Kontext einer Klasse aufgerufen werden.
Dann testet man diese Klasse in einer isolierten Umgebung (aka Testprogramm) und kann so sicherstellen, dass die Klasse in sich keine Speicher- oder Resourcenlecks hat.

Findet man später in der Anwendung ein Speicherleck ist die Wahrscheinlichkeit höher, dass man den Klassennamen angezeigt bekommt und so gezielt suchen kann.

Manchmal bekommt man nur allgemeine Klassennamen gemeldet (z.B. TStringList x 14), dann kann man auch von TStringList abgeleitete Klassen einsetzen.
Kleines Beispiel dazu:
Delphi-Quellcode:
// Klasse zum Laden von Daten aus einer Datei
// wird zum Datenimport verwendet
// die Datei darf nicht leer sein
TImportStringList = class(TStringList)
public
  procedure LoadFromFile(const FileName: string); override;
end;

procedure TImportStringList.LoadFromFile(const FileName: string);
begin
   inherited;
   if count = 0 then
      raise EBadImportFile.CreateFmt('Datei %s ist leer', [FileName]);
end;
So schlägt man zwei Fliegen mit einer Klappe.
Man kann kleine Teile der Funktionalität an TImportStringList übertragen (prüfen ob Datei leer ist) und ausserdem bekommt man bei einem Speicherleck gezielte Info wo zu suchen ist.

Die ganzen Punkte oben gelten speziell für sehr grosse Anwendungen mit Hunderten von Units.
Bei kleinen Anwendungen braucht man nicht so viel Aufwand zu treiben.
  Mit Zitat antworten Zitat
BerlinärBär

Registriert seit: 15. Apr 2010
8 Beiträge
 
#22

AW: Memory Leak: Ursache finden

  Alt 28. Feb 2013, 22:05
Hallo zusammen,

falls sich noch jemand für die Erklärung interessiert:
Es ist wirklich das 'FillChar', aber nur, weil es falsch angewandt wurde:
Statt 'FillChar( fHfgkFarbe, SizeOf( fHfgkFarbe ), 0)'
muss es 'FillChar( fHfgkFarbe[0], Length(fHfgkFarbe)*SizeOf(ein element davon), 0)'
heißen. Die obere Zeile leert nur die Feldvariable, aber der damit verbundene Speicherblock mit dem eigentlichen Feldinhalt ist ab dann für den Delphi-Speichermanager unsichtbar.

Gruß vom Bären!
  Mit Zitat antworten Zitat
Blup

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

AW: Memory Leak: Ursache finden

  Alt 1. Mär 2013, 11:29
@BerlinärBär Die Ursache für das Speicherleck wurde schon in #20 genannt.
  Mit Zitat antworten Zitat
BerlinärBär

Registriert seit: 15. Apr 2010
8 Beiträge
 
#24

AW: Memory Leak: Ursache finden

  Alt 1. Mär 2013, 19:37
@Blup: Ups, war wohl selektives Lesen...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 12:47 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