Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SetDelimitedText Memory Leak ? (https://www.delphipraxis.net/203658-setdelimitedtext-memory-leak.html)

venice2 9. Mär 2020 10:18

SetDelimitedText Memory Leak ?
 
Delphi-Quellcode:
var
  FileName: string;
  SplitPath: TstringList;
begin
  SplitPath := TStringList.Create;
  SplitPath.StrictDelimiter:= true;
  SplitPath.Delimiter := '\';

  try
    SplitPath.DelimitedText := ExtractFilePath(FileName);

    SplitPath.DelimitedText := ''; // bringt nichts
    SplitPath.Clear;              // auch nichts
  finally  
    FreeAndNil(SplitPath);
  end;
end;

SetDelimitedText ist der letzte Aufruf (Memory Leak)

Es wird alles freigegeben trotzdem habe ich hier Speicherlecks.

DieDolly 9. Mär 2020 10:33

AW: SetDelimitedText Memory Leak ?
 
Wenn ich deinen Code kopiere und statt dem ExtractFilePath(FileName) einen festen String nehme, habe ich keinen Leak.
Außerdem wird FileName nicht gesetzt.

venice2 9. Mär 2020 10:41

AW: SetDelimitedText Memory Leak ?
 
Zitat:

Zitat von DieDolly (Beitrag 1459232)
Außerdem wird FileName nicht gesetzt.

Getippt und zur Demonstration nicht nötig.
Denke jeder weis was gemeint ist.

Mir meldet Eurekalog in dieser Zeile 30 Memory Leaks
Delphi-Quellcode:
SplitPath.DelimitedText := ExtractFilePath(Files[IntI - 1]);
Files ist ein array of String.

himitsu 9. Mär 2020 11:34

AW: SetDelimitedText Memory Leak ?
 
Wo steht der Code?
Doch nicht etwa in einer Consolenanwendung in der DPR.
Wenn ja, dann verschieb das ganze mal in eine Prozedur.

Und welche Delphi-Verison?

venice2 9. Mär 2020 11:36

AW: SetDelimitedText Memory Leak ?
 
Zitat:

Zitat von himitsu (Beitrag 1459238)
Wo steht der Code?
Doch nicht etwa in einer Consolenanwendung in der DPR.
Wenn ja, dann verschieb das ganze mal in eine Prozedur.

Und welche Delphi-Verison?

Nein normale Procedure.
Delphi 10.3.3 64 Bit.

Gebe ich einen normalen String ein so wie die @DieDolly habe ich das problem auch nicht.
Das ist aber nicht die Voraussetzung so wie in meinem Beispiel.

Rolf Frei 9. Mär 2020 13:15

AW: SetDelimitedText Memory Leak ?
 
Ich vermute mal der entscheidende Teil deines Codes fehlt in deinem Beispiel. Was machst du mit dem Files Array? Gibst du das sauber frei?

venice2 9. Mär 2020 13:19

AW: SetDelimitedText Memory Leak ?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1459253)
Ich vermute mal der entscheidende Teil deines Codes fehlt in deinem Beispiel. Was machst du mit dem Files Array? Gibst du das sauber frei?

Delphi-Quellcode:
SetLength(Files, 0); // keine Auswirkung

Es wird auf den Copy befehl verzweigt.
Auch wenn ich den String selber splite.

Delphi-Quellcode:
Result[spCount - 1] := Copy(sTemp, 1, spPos - 1); // der leak soll hier entstehen

Das ist der letzte Aufruf in System
Delphi-Quellcode:
function _UStrCopy(const S: UnicodeString; Index, Count: Integer): UnicodeString;

Rolf Frei 9. Mär 2020 13:34

AW: SetDelimitedText Memory Leak ?
 
Am Ende Files := nil oder Finalize(Files) nutzen. Damit sollte der String-Speicher freigegben werden, wenn ich mich hier nicht komplett irre.

Lies dir mal das dazu durch: https://www.drbob42.com/delphi4/dynarray.htm

venice2 9. Mär 2020 13:42

AW: SetDelimitedText Memory Leak ?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1459260)
Am Ende Files := nil oder Finalize(Files) nutzen. Damit sollte der String-Speicher freigegben werden, wenn ich mich hier nicht komplett irre.

Lies dir mal das dazu durch: https://www.drbob42.com/delphi4/dynarray.htm

Wenn ich das Array mit SetLength(Files, 0); auf 0 setze dann ist es NIL.
Beide Tips nutzen nichts. Danke, haben kein Auswirkung

Rolf Frei 9. Mär 2020 13:56

AW: SetDelimitedText Memory Leak ?
 
Wenn ich dein Beispiel nehme und selber noch eine Files-Array erstelle (Array of String), bekomme ich keine Memoryleaks. Also muss irgendwas im Beispiel noch fehlen, das wir nicht wissen.

Mein Testcode ohne Memoryleaks. Wenn ich Testeshalber das FreeAndNil rausnehme, habe ich wie erwartet ein Memoryleak.
Delphi-Quellcode:
Im DPR:   ReportMemoryLeaksOnShutdown := True;

procedure TForm1.FormCreate(Sender: TObject);
var
  FileName: string;
  SplitPath: TstringList;
  s: Array of String;
begin
  SetLength(s, 2);
  s[0] := 'c:\asfdsdf\sdf';
  s[1] := 'c:\asfds2df\s2df';

  SplitPath := TStringList.Create;
  try
    SplitPath.StrictDelimiter:= true;
    SplitPath.Delimiter := '\';

    SplitPath.DelimitedText := ExtractFilePath(s[0]);

    SplitPath.DelimitedText := ''; // bringt nichts
    SplitPath.Clear; // auch nichts
  finally
    FreeAndNil(SplitPath);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr.
Seite 1 von 3  1 23      

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