AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Memory Leak bei FindFirst/TSearchRec trotz FileClose
Thema durchsuchen
Ansicht
Themen-Optionen

Memory Leak bei FindFirst/TSearchRec trotz FileClose

Ein Thema von crowley · begonnen am 16. Jan 2009 · letzter Beitrag vom 16. Dez 2009
Antwort Antwort
crowley

Registriert seit: 7. Jun 2006
Ort: Emmerich
9 Beiträge
 
#1

Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Jan 2009, 16:39
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:
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.
FastMM schmeißt folgenden Report raus:

Zitat:
--------------------------------2009/1/16 16:29:18--------------------------------
A memory block has been leaked. The size is: 28

Stack trace of when this block was allocated (return addresses):
402BB4
404265
404290
40A1FC
40A273
40CCF7
7C90DC9C [ZwSetInformationThread]
7C817067 [RegisterWaitForInputIdle]
7C817070 [RegisterWaitForInputIdle]

The block is currently used for an object of class: Unknown

The allocation number is: 97

Current memory dump of 256 bytes starting at pointer address DAB0B0:
01 00 00 00 10 00 00 00 73 76 63 43 41 4C 77 6D 73 52 52 50 2E 6C 6F 67 00 00 B2 50 F8 10 80 80
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
. . . . . . . . s v c C A L w m s R R P . l o g . . ² P ø . € €
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

--------------------------------2009/1/16 16:29:18--------------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

21 - 28 bytes: String x 1

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".
Hat von Euch jemand eine Idee, wie ich das Loch stopfen kann? Oder hab ich etwas ganz Elementares übersehen?

Lieben Gruß und vielen Dank im Voraus,

C.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Jan 2009, 16:56
Hallo,

das Loch muss nicht von Dir sein.
Ist es auch noch vorhanden, wenn Du mal diesen Bereich auskommentierst:
Delphi-Quellcode:
if (SameText(loc_dummy, loc_sr.Name)) then begin
  Writeln('Found file: ' + loc_sr.Name);
end;
Ist es auch noch vorhanden, wenn Du die Suche mal komplett auskommentierst?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Jan 2009, 17:33
Ich würde sagen in TSearchrec ist noch eine Referenz auf den String.
Schieb den Code mal in eine Procedure!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
crowley

Registriert seit: 7. Jun 2006
Ort: Emmerich
9 Beiträge
 
#4

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 21. Jan 2009, 12:38
Zitat von nahpets:
Hallo,

das Loch muss nicht von Dir sein.
Ist es auch noch vorhanden, wenn Du mal diesen Bereich auskommentierst:
Delphi-Quellcode:
if (SameText(loc_dummy, loc_sr.Name)) then begin
  Writeln('Found file: ' + loc_sr.Name);
end;
Ist es auch noch vorhanden, wenn Du die Suche mal komplett auskommentierst?
Das Speicherloch ist auch dann noch da, wenn ich diesen Block auskommentiere o_O
Es reicht das FindFirst, um das Leak zu bekommen.



Zitat von sirius:
Ich würde sagen in TSearchrec ist noch eine Referenz auf den String.
Schieb den Code mal in eine Procedure!
Sirius, danke dir... das hat geholfen. Jetzt steht der Code in einer eigenen Prozedur und das Speicherloch ist weg o_O
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

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

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 21. Jan 2009, 16:38
Es liegt daran, dass Du globale Variablen verwendest. Lagerstr Du alles in eine separate Prozedur aus, gibt es kein Speicherleck:
Delphi-Quellcode:
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.
Oder, alternativ mit Finalize(loc_sr).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Dez 2009, 19:32
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 := '';
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Dez 2009, 19:39
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 :='';
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#8

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Dez 2009, 20:11
Danke, da bin ich aber beruhigt. So hatte ich mir das auch vorgestellt.

Danke!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Memory Leak bei FindFirst/TSearchRec trotz FileClose

  Alt 16. Dez 2009, 20:45
Moin crowley,

auch wenn der Thread hier fast ein Jahr alt ist...

Das hier

faAnyFile - faDirectory sollte man nicht machen.
Um ein Bit, oder mehrere Bits, auszumaskieren sollte man

faAnyFile and not faDirectory schreiben, um eventuelle, unerwünschte, Seiteneffekte zu verhindern.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:29 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