AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherverwaltung

Ein Thema von GroHae · begonnen am 30. Mär 2010 · letzter Beitrag vom 30. Mär 2010
Antwort Antwort
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#1

Speicherverwaltung

  Alt 30. Mär 2010, 09:32
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:

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.
Und mein "Test"

Delphi-Quellcode:

procedure 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 dem Button drücken sagt der Taskmanager 3.516 K
Vor ShowMassage dann 17.252 K
Danach dann 6.332 K

Warum komme ich nicht mehr auf die 3.516 K ??

Grüße

Thomas
Grüße

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Speicherverwaltung

  Alt 30. Mär 2010, 09:56
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Speicherverwaltung

  Alt 30. Mär 2010, 10:04
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?
Grüße

Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#4

Re: Speicherverwaltung

  Alt 30. Mär 2010, 10:07
Dann brauchst Du Tools, die nach solchen MemoryLeaks suchen. Zum Beispiel FastMM, oder auch die Suche, die im Eurekalog eingebaut ist.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: Speicherverwaltung

  Alt 30. Mär 2010, 10:07
Mit Speicher-Prüfuungen?

MemCheck
und FastMM hat da auch eine Prüfung, welche man aktivieren kann
$2B or not $2B
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Speicherverwaltung

  Alt 30. Mär 2010, 10:15
OK,

Danke für die Antworten!

Dann werde ich mir das mal bei Gelegenheit anschauen.

Grüße

Thomas
Grüße

Thomas
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#7

Re: Speicherverwaltung

  Alt 30. Mär 2010, 10:33
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:
  ReportMemoryLeaksOnShutdown := DebugHook<>0; //Speicherprüfung nur in der IDE
  Mit Zitat antworten Zitat
GroHae

Registriert seit: 19. Apr 2007
Ort: Nabburg
83 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Speicherverwaltung

  Alt 30. Mär 2010, 11:23
oha, Danke für den Tipp

da hab ich schon ein paar Meldungen.

Rech viele betreffen TDBX...
Grüße

Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 Uhr.
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