![]() |
Delphi-Version: 10.3 Rio
ZIP File names memory leak
Hallöchen,
Neulich habe ich die Delphi-interne Funktion zum Memory-Leaks "erkennen" für mich entdeckt (namentlich
Delphi-Quellcode:
) und gehe jetzt ein paar meiner Projekte durch, um mich schämen zu können.
ReportMemoryLeaksOnShutdown := true;
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:
Nun entsteht beim
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;
Delphi-Quellcode:
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
zip.FileNames
Delphi-Quellcode:
Nicht, dass mir ein Spaßvogel weise machen will, es muss woanders im Code sein.
var
zip: TZipFile; begin zip := TZipFile.Create; zip.Open(AFile, zmRead); zip.FileNames; // Ohne diese Zeile kein Leak zip.Free; end; Nun dir Frage: Ist das ein Fehler meinerseits, muss ich irgendwas ändern oder ist es ein Fehler der TZipFile Klasse? Beste Grüße |
AW: ZIP File names memory leak
Vielleicht hilft die Zeile
Delphi-Quellcode:
weiter.
zip:= NIL;
Gruß, Andreas |
AW: ZIP File names memory leak
Kann ich hier mit einer beliebigen Zip-Datei nicht reproduzieren.
TZipFile erzeugt aber innerhalb GetFileNames eine CP437-TEncoding
Delphi-Quellcode:
, wenn die ZIP-Datei im Header kein UTF8 Flag gesetzt hat. Das wird dann im
class var
Delphi-Quellcode:
wieder freigegeben. Möglicherweise passiert das erst nach dem Leak-Report.
class destructor
|
AW: ZIP File names memory leak
Die TStringList am Ende freizugeben wäre hilfreich.
|
AW: ZIP File names memory leak
Zitat:
Zitat:
(z.B. in einem Konsolenprogramm, ohne etwas drumrum) |
AW: ZIP File names memory leak
Zitat:
|
AW: ZIP File names memory leak
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
Delphi-Quellcode:
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)
class var
@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
Delphi-Quellcode:
scheint nicht zu funktionieren.
ReportMemoryLeaksOnShutdown := true;
|
AW: ZIP File names memory leak
Liste der Anhänge anzeigen (Anzahl: 1)
Damit ihr es auch reproduzieren könnt, hänge ich hier mal eine .zip an, mit der der Leak bei mir auftritt.
|
AW: ZIP File names memory leak
Zitat:
Vielleicht doch ein komplettes Beispielprojekt? |
AW: ZIP File names memory leak
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz