![]() |
AW: Hilfestellung zu meinem Speicherleck
Nochmal: GetAllRunningProcs erzeugt je Aufruf eine neue Instanz von TStringlist. Ich sehe aber nicht, wo diese wieder freigegeben wird. Daher mein Rat, die Liste außerhalb zu erzeugen und an die Routine zu übergeben, dann kannst Du sie auch wieder freigeben, da Du es nur mit einer Instanz zu tun hast.
|
AW: Hilfestellung zu meinem Speicherleck
Moment, ich kann dir gerade nicht folgen:
Meine erzeugte TStringList wird doch am Ende freigegeben, oder etwa nicht?
Delphi-Quellcode:
function TProcessHandler.GetAllRunningProcs: TStringList;
// returns all currently running processes var s: string; sl: TStringList; begin Result := nil; sl := TStringList.Create; // <--- HIER erzeuge ich es... try hProcSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcSnap <> INVALID_HANDLE_VALUE) then begin pe32.dwSize := SizeOf(ProcessEntry32); if (Process32First(hProcSnap, pe32)) then begin s := pe32.szExeFile; sl.Add(s); while Process32Next(hProcSnap, pe32) do begin s := pe32.szExeFile; sl.Add(s); end; end; Result := sl; end; CloseHandle(hProcSnap); finally sl := nil; // <--- HIER & sl.Free; // <--- HIER wird´s doch wieder gelöscht? end; end; |
AW: Hilfestellung zu meinem Speicherleck
Du setzt sie doch vorher auf nil, wie willst Du sie denn wieder freigeben? Wie gesagt, wenn Du die Befehle umdrehst zeigt Result dann nach dem Freigeben auf eine nicht mehr existente Instanz, das ist also auch nicht die Lösung. Versuch es doch einmal so:
Delphi-Quellcode:
Der Prozedur übergibst Du dann einfach die zu füllende Stringliste.
procedure TProcessHandler.GetAllRunningProcs(ResultList: TStrings);
// returns all currently running processes var s: string; // User: string; begin // User := GetEnvironmentVariable('USERNAME'); if Assigned(ResultList) then begin ResultList.BeginUpdate; try ResultList.Clear; hProcSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcSnap <> INVALID_HANDLE_VALUE) then begin pe32.dwSize := SizeOf(ProcessEntry32); if (Process32First(hProcSnap, pe32)) then begin s := pe32.szExeFile; // if GetUsernameByExeName(s) = User then ResultList.Add(s); while Process32Next(hProcSnap, pe32) do begin s := pe32.szExeFile; // if GetUsernameByExeName(s) = User then ResultList.Add(s); end; end; end; CloseHandle(hProcSnap); finally ResultList.EndUpdate; end; end; end; |
AW: Hilfestellung zu meinem Speicherleck
Achso, danke DeddyH. Du hast natürlich Recht...nun hab ich es auch verstanden :oops:
Eine Frage noch: Die GetAllProcs-procedure befindet sich in einer eigenen Klasse. Sollte ich das Resultat als property oder als richtiges Result zurückgeben? Oder gar nicht und die Procedure in die MainForm übernehemen? |
AW: Hilfestellung zu meinem Speicherleck
Die Frage verstehe ich nicht. Je nachdem, ob die Methode öffentlich ist oder nicht, kann sie ja von außen aufgerufen werden. Ist sie nur intern, kannst Du natürlich auch den ResultList-Parameter weglassen und stattdessen gleich die Stringliste der Klasse dafür einsetzen.
|
AW: Hilfestellung zu meinem Speicherleck
Ich bedanke mich bei allen Helfern, ganz besonderns dir DeddyH. Ich weiß was ich nun machen muss :)
|
AW: Hilfestellung zu meinem Speicherleck
Zitat:
|
AW: Hilfestellung zu meinem Speicherleck
Korrekt, das hatte ich ja auch bereits 2 mal erklärt ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 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