![]() |
Speicherverwaltung
Hallo zusammen,
Wenn ich meine Programme mit dem Taskmanager beobachte stelle ich fest, dass zur Laufzeit nicht immer der Arbeitspeicher ganz frei gegeben wird. Ich habe mir jetzt eine Minianwendung geschrieben um mir das genauer anzuschauen. Hier der Code:
Delphi-Quellcode:
Und mein "Test"unit UnitDB_Prozess; interface uses classes, dialogs, sysutils; type {$REGION 'Typendeklaration Prozess'} TRecProzess = class(TObject) private FFirmenNr_ID : integer; FProzess_ID : integer; FName : string; protected public procedure Clear; procedure Copy(iQ: TRecProzess); function ISEqual(iQ: TRecProzess): boolean; function Clone: TRecProzess; property FirmenNr_ID: integer read FFirmenNr_ID write FFirmenNr_ID; property Prozess_ID: integer read FProzess_ID write FProzess_ID; property Name: string read FName write FName; end; {$ENDREGION} implementation {$REGION 'TRecProzess'} procedure TRecProzess.Clear; begin FFirmenNr_ID := 0; FProzess_ID := 0; FName := ''; end; procedure TRecProzess.Copy(iQ: TRecProzess); begin FFirmenNr_ID := iQ.FirmenNr_ID; FProzess_ID := iQ.Prozess_ID; FName := iQ.Name; end; function TRecProzess.ISEqual(iQ: TRecProzess): boolean; begin result := (FFirmenNr_ID = iQ.FirmenNr_ID) and (FProzess_ID = iQ.Prozess_ID) and (FName = iQ.Name); end; function TRecProzess.Clone: TRecProzess; begin result := TRecProzess.Create; result.Copy(self); end; {$ENDREGION} end.
Delphi-Quellcode:
Vor dem Button drücken sagt der Taskmanager 3.516 Kprocedure TForm6.Button1Click(Sender: TObject); var FObjListe : TObjectList; i : integer; begin FObjListe := TObjectList.Create; for i := 0 to 500000 - 1 do begin FObjListe.Add(TRecProzess.Create) end; ShowMessage('Hallo'); FObjListe.Free; end; Vor ShowMassage dann 17.252 K Danach dann 6.332 K Warum komme ich nicht mehr auf die 3.516 K ?? Grüße Thomas |
Re: Speicherverwaltung
Weil der Speichermanager von Delphi nicht immer den Speicher wieder an Windows zurück gibt. Dann muss er ihn nicht immer wieder neu von Windows anfordern, was immer relativ zeitaufwendig ist.
|
Re: Speicherverwaltung
Und wie kann ich mir dann bei großen Projekten sicher sein, das ich nicht irgendwo Fehler bei der Freigabe von Objekten mache?
Vor allem wenn das Projekt schon 8-10 Jahre auf den Buckel hat und nie mit Testfällen oder ähnlichen gearbeitet wurde? ;-) |
Re: Speicherverwaltung
Dann brauchst Du Tools, die nach solchen MemoryLeaks suchen. Zum Beispiel FastMM, oder auch die Suche, die im Eurekalog eingebaut ist.
Sherlock |
Re: Speicherverwaltung
Mit Speicher-Prüfuungen?
MemCheck und FastMM hat da auch eine Prüfung, welche man aktivieren kann |
Re: Speicherverwaltung
OK,
Danke für die Antworten! Dann werde ich mir das mal bei Gelegenheit anschauen. Grüße Thomas |
Re: Speicherverwaltung
Hallo GroHae,
bei Delphi 2007 ist FastMM4 bereits eingebaut. Es genügt die Speicherprüfung in der *.dpr einzuschalten. Wenn die Anwendung beendet wird und der Speicher nicht komplett freigegeben wurde erscheint eine Messagebox. Ich mache das so:
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := DebugHook<>0; //Speicherprüfung nur in der IDE
|
Re: Speicherverwaltung
oha, Danke für den Tipp
da hab ich schon ein paar Meldungen. Rech viele betreffen TDBX... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 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