![]() |
Memory Leak bei FindFirst/TSearchRec trotz FileClose
Servus,
ich hab ein Problem mit TSearchRec bzw. FindFirst. Trotz des FileClose tritt bei meinem Code immer noch ein MemoryLeak auf. Ich benutze Delphi 7 und FastMM 4.78 Hier ein ganz rudimentärer Beispiel- Code für eine Konsolenanwendung. Jetzt nicht über den Sinn oder Unsinn dieses Codes diskutieren, das hier dient nur der Veranschaulichung, dass da ein Speicherleck auftritt:
Delphi-Quellcode:
FastMM schmeißt folgenden Report raus:
program Project1;
{$APPTYPE CONSOLE} {$I common.inc} uses FastMM4 in '..\FastMM\FastMM4.pas', SysUtils; var loc_path: String; loc_dummy: String; loc_sr: TSearchRec; begin loc_path := 'C:\Temp\'; loc_dummy := 'TestFile.log'; if FindFirst(loc_path + '*.log', faAnyFile - faDirectory, loc_sr) = 0 then try repeat if (SameText(loc_dummy, loc_sr.Name)) then begin Writeln('Found file: ' + loc_sr.Name); end; until (FindNext(loc_sr) <> 0); finally FindClose(loc_sr); end; { Free memory of string vars } loc_path := ''; loc_dummy := ''; end. Zitat:
Lieben Gruß und vielen Dank im Voraus, C. |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Hallo,
das Loch muss nicht von Dir sein. Ist es auch noch vorhanden, wenn Du mal diesen Bereich auskommentierst:
Delphi-Quellcode:
Ist es auch noch vorhanden, wenn Du die Suche mal komplett auskommentierst?
if (SameText(loc_dummy, loc_sr.Name)) then begin
Writeln('Found file: ' + loc_sr.Name); end; |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Ich würde sagen in TSearchrec ist noch eine Referenz auf den String.
Schieb den Code mal in eine Procedure! |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Zitat:
Es reicht das FindFirst, um das Leak zu bekommen. Zitat:
|
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Es liegt daran, dass Du globale Variablen verwendest. Lagerstr Du alles in eine separate Prozedur aus, gibt es kein Speicherleck:
Delphi-Quellcode:
Oder, alternativ mit Finalize(loc_sr).
procedure FindLogFiles;
var loc_path: String; loc_dummy: String; loc_sr: TSearchRec; begin loc_path := 'C:\Temp\'; loc_dummy := 'TestFile.log'; if FindFirst(loc_path + '*.log', faAnyFile - faDirectory, loc_sr) = 0 then try repeat if (SameText(loc_dummy, loc_sr.Name)) then begin Writeln('Found file: ' + loc_sr.Name); end; until (FindNext(loc_sr) <> 0); finally FindClose(loc_sr); end; { Free memory of string vars } loc_path := ''; loc_dummy := ''; end; begin FindLogFiles; end. |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Als Anfänger mal nachgefragt:
Muss man lokale Variable wirklich so freigeben? Ich dachte, die entfallen am Ende der Prozedur automatisch?!
Delphi-Quellcode:
{ Free memory of string vars }
loc_path := ''; loc_dummy := ''; |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Neee, muß man nicht ... zumindestens nicht in Delphi.
String (AnsiString/WideString/UnicodeString), dynamische Arrays und Interfaces werden utomatisch freigegeben und vorher auch initialisiert. Für diese beiden lokalen Strings versteckt sich also in BEGIN (der Prozedur) eine Initialisierung und im END eine Finalisierung aka :=''; |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Danke, da bin ich aber beruhigt. So hatte ich mir das auch vorgestellt.
Danke! |
Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose
Moin crowley,
auch wenn der Thread hier fast ein Jahr alt ist... ;-) Das hier
Delphi-Quellcode:
sollte man nicht machen.
faAnyFile - faDirectory
Um ein Bit, oder mehrere Bits, auszumaskieren sollte man
Delphi-Quellcode:
schreiben, um eventuelle, unerwünschte, Seiteneffekte zu verhindern.
faAnyFile and not faDirectory
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 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