Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hilfestellung zu meinem Speicherleck (https://www.delphipraxis.net/160359-hilfestellung-zu-meinem-speicherleck.html)

DeddyH 9. Mai 2011 18:36

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.

delphinub23 9. Mai 2011 18:40

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;

DeddyH 9. Mai 2011 18:44

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:
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;
Der Prozedur übergibst Du dann einfach die zu füllende Stringliste.

delphinub23 9. Mai 2011 18:49

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?

DeddyH 9. Mai 2011 18:58

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.

delphinub23 9. Mai 2011 19:01

AW: Hilfestellung zu meinem Speicherleck
 
Ich bedanke mich bei allen Helfern, ganz besonderns dir DeddyH. Ich weiß was ich nun machen muss :)

nuclearping 10. Mai 2011 11:23

AW: Hilfestellung zu meinem Speicherleck
 
Zitat:

Zitat von delphinub23 (Beitrag 1099818)
@ DeddyH:
Zitat:

Zitat:
Delphi-Quellcode:
   finally
     sl := nil;
     sl.Free;
   end;

Wenn ich nur .Free rufe, dann bekomme ich eine Exception. Darum diese komische Variante :(

Du bekommst die Exception, weil du in der Funktion Result die TStringList sl zuweist. Result := sl. Result und sl sind damit das gleiche, das gleiche Objekt, der gleiche Speicher. Wenn du nun sl.Free machst, machst du auch gleichzeitig Result.Free und deswegen hats geknallt.

DeddyH 10. Mai 2011 12:08

AW: Hilfestellung zu meinem Speicherleck
 
Korrekt, das hatte ich ja auch bereits 2 mal erklärt ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 2 von 2     12   

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