![]() |
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. |
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. |
AW: SetDelimitedText Memory Leak ?
Zitat:
Denke jeder weis was gemeint ist. Mir meldet Eurekalog in dieser Zeile 30 Memory Leaks
Delphi-Quellcode:
Files ist ein array of String.
SplitPath.DelimitedText := ExtractFilePath(Files[IntI - 1]);
|
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? |
AW: SetDelimitedText Memory Leak ?
Zitat:
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. |
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?
|
AW: SetDelimitedText Memory Leak ?
Zitat:
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;
|
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: ![]() |
AW: SetDelimitedText Memory Leak ?
Zitat:
Beide Tips nutzen nichts. Danke, haben kein Auswirkung |
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; |
AW: SetDelimitedText Memory Leak ?
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Dann poste doch mal deinen kompletten code, dann kann man dir sicherlich besser helfen.
|
AW: SetDelimitedText Memory Leak ?
Schade, das wäre eine einfache Erklärung gewesen, da globale Variablen in der DPR erst entladen werden, nachdem der Speichermanager aufgeröumt wurde.
Zitat:
TStringList nutzt intern ein dynamisches Array mit den Strings der Zeilen, da hätte ein Fehler schon lange auffallen müssen, und im Setter des DelimitedText sollten die temporären Strings für das Zerlegen eigentlich auch automatisch aufgeräumt werden. |
AW: SetDelimitedText Memory Leak ?
Ich habe es mit 2 Varianten versucht.
1 mal mit TStringList und einmal von Hand (also eigene Split Funktion) Bei beiden funktioniert es nicht. Stehe irgendwie auf dem Schlauch na gut ist halt so. Seltsam ist nur das ich mit reinen Strings arbeite also keine Konvertierung von PWideChar, WideString oder der gleichen. Trotzdem :evil: Zitat:
Am ende gebe ich alles frei wie schon gezeigt aber die Leaks bleiben bestehen. |
AW: SetDelimitedText Memory Leak ?
Hallo,
dann brauche wir ein compilierfähiges Minimalprojekt, also: - leeres Projekt anlegen - eine neue Unit (ohne DFM) anlegen - deinen Code dort rein und in der DPR aufrufen. Dann alles in eine Zip-Datei und hier hochladen (ohne die Exe). |
AW: SetDelimitedText Memory Leak ?
Zitat:
Ich weis das es manchmal nötig ist Quelltexte zur Verfügung zu stellen aber ich sagte schon das bringt nichts ich kann es als Minimal Beispiel nicht auslegen. Von daher wird mir wohl niemand helfen können muss mich da wohl selber durchbeißen. |
AW: SetDelimitedText Memory Leak ?
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Zitat:
Gruß K-H |
AW: SetDelimitedText Memory Leak ?
Hallo,
Zitat:
1. Wenn es kein schleichender "Programm verbraucht immer mehr Speicher"-Fehler ist -> ignorieren, Windows räumt ja eh auf 2. Sollte es Punkt 1 sein, hilft hier nur radikal - alle Aufrufe totlegen - Programm starten, testen - ersten Aufruf reinnehmen, testen usw. Das mussten wir bei uns schon öfters machen. Was dann bei "altem, bewährten, war schon immer so Code" rauskaum, poste ich lieber nicht ;) |
AW: SetDelimitedText Memory Leak ?
Ist denn 100% sicher was da leakt?
Evtl. nämlich mal mit der vollen fastMM4 Version den Leakreport durchführen lassen, denn der kann einem auch zeigen wo der Speicher allokiert wurde. Evtl. leakt ja was anderes als gedacht. Wobei ich mich da schon immer fragte, waru7m bei Delphi nicht diese volle Version dabei ist, wenn die doch auch OpenSOurce ist... |
AW: SetDelimitedText Memory Leak ?
Moin...:P
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Zitat:
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Zitat:
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Zitat:
Ich verwende EurekaLog und das kann mindestens das was FastMM ebenfalls kann. Es ist mir bekannt was den Leak verursacht nur ich kann ihn nicht beheben. Zitat:
Für mich hört es sich so an das der Dumme wie immer hinter der Tastatur sitzt. Mit Thesen hat das nichts zu tun. |
AW: SetDelimitedText Memory Leak ?
Nja, es kommt drauf an, was/wieviel Embarcadero damals von Pierre gekauft hatte.
Und man hätte da dann noch so Einiges mehr umbauen müssen, also die ganzen Settings weg von Options-INC+IFDEF hin zu Variable/Parameter+IF-THEN, denn die System-Unit neu zu kompilieren, nur um die Optionen zu ändern, geht nicht so gut. Beim Debuggen ist Eurekalog das Schlimmste, was ich mir vorstellen kann (leidliche Erfahrung, wenn man bei Debuggen im Code/Assembler dessen Hooks landet und nicht mehr raus kommt) und effektiv ist das Einzige, was wir beim Kunden wirklich zur Laufzeit nutzen, der Stacktrace und dafür müsste sich das Ding nicht so dermaßen penetrant überall reinhacken. Für's Debugging gab es noch eine andere Memory-Debug-Komponente, die auch den Ersteller und die Zeit zu den Speicherblocks speichert/loggt und somit sagen kann von wem der Speicher "ursprünglich" stammt, welcher übrig bleibt, bzw. wer zuerst den einen Speicher/Objekt freigab, wenn später nochmal jemand das machen will. |
AW: SetDelimitedText Memory Leak ?
Zitat:
Zitat:
|
AW: SetDelimitedText Memory Leak ?
Zitat:
Alles gut. |
AW: SetDelimitedText Memory Leak ?
:cheers: ...Biergarten.
|
AW: SetDelimitedText Memory Leak ?
Da wenig input kommt an denen man was erkennen könnte würde ich hoika's vorschlag mir zu herzen nehmen, auch wenn es je nach vielfalt des kodes lange dauern könnte.
Zitat:
Hier ist auch ein EurekaLog Nutzer, mir gefällts, zum debuggen deaktivier ich's und hab null hooks /ot |
AW: SetDelimitedText Memory Leak ?
Problem ist bei knapp 100 DLLs/BPLs, ist das irgendwo auch nur einen Hauch drin, schießt Eurekalog das ganze Programm ab,
anstatt nur eine Meldung auszugeben "keine Dedubinfos gefunden", kommt die Meldung und dann ein TerminateProcess. Außerdem pfuscht der ECC an den Projektoptionen rum und zerballert die Debuginfos vom Delphi (klar, der hat ja seine eigenen "Besseren" und braucht den Rest nicht mehr), wodurch bei vielen Packages im Debugger oft keine Variablen aufgelöst werden können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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 by Thomas Breitkreuz