AGB  ·  Datenschutz  ·  Impressum  







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

ZIP File names memory leak

Ein Thema von tumo · begonnen am 5. Jun 2020 · letzter Beitrag vom 8. Jun 2020
Antwort Antwort
Seite 1 von 3  1 23      
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#1

ZIP File names memory leak

  Alt 5. Jun 2020, 00:01
Delphi-Version: 10.3 Rio
Hallöchen,

Neulich habe ich die Delphi-interne Funktion zum Memory-Leaks "erkennen" für mich entdeckt (namentlich ReportMemoryLeaksOnShutdown := true; ) und gehe jetzt ein paar meiner Projekte durch, um mich schämen zu können.

In meinem aktuellsten Projekt war es so schlimm, dass ich einfach alles von null begonnen und fein säuberlich wieder aufgebaut habe. Dabei vergleicht mein Programm den Inhalt eines ZIP-Archives mit einem vorhandenen Ordner, um fehlende Dateien zu erkennen. Zum Vergleichen erstelle ich je eine StringList, für den Ordner habe ich eine kleine Funktion geschrieben, alles prima.

Fürs ZIP-Archiv gibt es beim built-in TZipFile die geradezu perfekte Eigenschaft FileNames, die mir mein Leben paradiesisch einfach macht.
Delphi-Quellcode:
var
  zip: TZipFile;
  sl: TStringList;
begin
  zip := TZipFile.Create;
  zip.Open(APath, zmRead);
  sl := TStringList.Create;
  sl.AddStrings(zip.FileNames); // Ohne diese Zeile kein Leak
  zip.Free;
end;
Nun entsteht beim zip.FileNames offensichtlich ein TMBSCEncoding, dass nie korrekt freigegeben wird, jedenfalls meckert der Leak-Detektor am Ende rum. Das absolute Minimum um diesen Leak auszulösen ist übrigens
Delphi-Quellcode:
var
  zip: TZipFile;
begin
  zip := TZipFile.Create;
  zip.Open(AFile, zmRead);
  zip.FileNames; // Ohne diese Zeile kein Leak
  zip.Free;
end;
Nicht, dass mir ein Spaßvogel weise machen will, es muss woanders im Code sein.

Nun dir Frage: Ist das ein Fehler meinerseits, muss ich irgendwas ändern oder ist es ein Fehler der TZipFile Klasse?

Beste Grüße
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#2

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 00:26
Vielleicht hilft die Zeile zip:= NIL; weiter.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 00:31
Kann ich hier mit einer beliebigen Zip-Datei nicht reproduzieren.

TZipFile erzeugt aber innerhalb GetFileNames eine CP437-TEncoding class var , wenn die ZIP-Datei im Header kein UTF8 Flag gesetzt hat. Das wird dann im class destructor wieder freigegeben. Möglicherweise passiert das erst nach dem Leak-Report.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 00:44
Die TStringList am Ende freizugeben wäre hilfreich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 02:45
Zitat:
Delphi-Quellcode:
var
  sl: TStringList;
begin
  ...
  sl := TStringList.Create;
  sl.AddStrings(...); // Ohne diese Zeile kein Leak
  ...
end;
Jupp, auch Ohne ein Leck.

Zitat:
zip.FileNames; // Ohne diese Zeile kein Leak
Wie und wo hast du denn diesen Codes getestet?
(z.B. in einem Konsolenprogramm, ohne etwas drumrum)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 09:26
Jupp, auch Ohne ein Leck.
Also, ich habe noch keine ZIP-Datei gefunden, die zu einem Memory-Leak führt. Offenbar sind hier alle UTF8.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 09:40
Danke erstmal für die schnellen Antworten.

@Andreas13
Hat leider nicht geholfen.

@Uwe Raabe
Möglich ist es. Um das zu testen könnte man seine eigene Klasse mit class var schreiben. Bei einem schnellen Test hat das aber keinen Leak gebracht (im konkreten Beispiel hab ich eine Klasse mit class constructor/destructor geschrieben, die eine class var TStringList initialisiert/freet)

@sahimba
Passiert auch noch. Ich dachte nur, es hilft mehr, den Code zu sehen, der den Fehler auch auslöst.

@himitsu
Hab es erst nur in VCL-Projekten getestet (einfach ins FormCreate geschrieben und die Anwendung händisch geschlossen). Hab mir gerade noch einmal eine frische Konsolenanwendung genommen, wie detektiert man dort die Speicherleaks? Ein simples ReportMemoryLeaksOnShutdown := true; scheint nicht zu funktionieren.
  Mit Zitat antworten Zitat
tumo

Registriert seit: 28. Apr 2014
46 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 09:45
Damit ihr es auch reproduzieren könnt, hänge ich hier mal eine .zip an, mit der der Leak bei mir auftritt.
Angehängte Dateien
Dateityp: zip ActuallyAdditions-1.12.2-r151-2.zip (2,58 MB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 09:50
Damit ihr es auch reproduzieren könnt, hänge ich hier mal eine .zip an, mit der der Leak bei mir auftritt.
Interessant! Hier wird kein Leak gemeldet. (Delphi 10.3.3)

Vielleicht doch ein komplettes Beispielprojekt?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: ZIP File names memory leak

  Alt 5. Jun 2020, 09:58
Zitat:
Delphi-Quellcode:
var
  sl: TStringList;
begin
  ...
  sl := TStringList.Create;
  sl.AddStrings(...); // Ohne diese Zeile kein Leak
  ...
end;
Jupp, auch Ohne ein Leck.
Also, ich habe noch keine ZIP-Datei gefunden, die zu einem Memory-Leak führt.
Da wird eine StringList erstellt, egal ob man ihr String hinzufügt oder nicht, dieses Objekt selbst ist schon ein Seicherleck, wenn man es nicht freigibt.
$2B or not $2B

Geändert von himitsu ( 5. Jun 2020 um 10:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:13 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