Einzelnen Beitrag anzeigen

romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.164 Beiträge
 
Delphi 10 Seattle Professional
 
#1

TObjectList - Objekte löschen, speicher freigeben???

  Alt 30. Sep 2008, 13:01
Hallo!

Ich habe eine eine neue Klasse erstellt mit einer TObjectList drin, in die mehrere Instanzen einer anderen Klasse hinzufügt werden. Nun möchte ich es so machen, wenn ein Item aus TObjectList gelöscht wird, soll auch das eigentliche Objekt freigegeben werden. Bei mir ist es leider nicht der Fall. Ich füge 10000 Objekte hinzu und beobachte im Windows Taskmanager, wie viel Arbeitsspeicher verwendet wird. Wenn ich dann die Liste mit Clear sauber mache, bleibt die Höhe des verwendeten Arbeitsspeicher fast unverändert, als ob dir Objekte alle noch da währen. Die Eingeschaft OwnsObjects der TObjectList ist auf true gesetzt. Warum ist es so, was mache ich falsch?

Delphi-Quellcode:
type
  TImmObject = class(TObject)
  private
    FStatus: integer;
    FTyp: integer;
  public
    constructor Create;
    destructor Destroy; override;

    property Status: integer read FStatus write FStatus;
    property Typ: integer read FTyp write FTyp;
end;

type
  TImmObjects = class(TComponent)
  private
    FImmObjects: TObjectList;
  protected
    function GetImmObject(Index: Integer): TImmObject;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    function Count: integer;
    property ImmObject[Index: integer]: TImmObject read GetImmObject;
    property ImmObjects: TObjectList read FImmObjects write FImmObjects;
    procedure Clear;
end;

...

var
  Wohnungen: TImmObjects;

...

constructor TImmObject.Create;
begin
  inherited Create;
end;

destructor TImmObject.Destroy;
begin
  inherited Destroy;
end;

...

constructor TImmObjects.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FImmObjects := TObjectList.Create(true);
end;

destructor TImmObjects.Destroy;
begin
  FImmObjects.Free;
  inherited Destroy;
end;

function TImmObjects.GetImmObject(Index: Integer): TImmObject;
begin
  Result := (FImmObjects.Items[Index] as TImmObject);
end;

function TImmObjects.Count: integer;
begin
  Result := FImmObjects.Count;
end;

procedure TImmObjects.Clear;
begin
  FImmObjects.Clear;
end;

...

{Die Liste wird erstellt}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Wohnungen := TImmObjects.Create(nil);
end;

{Hier werden die Objekte hinzufügt}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  Wohnung: TImmObject;
begin
  for i := 0 to 100000 do
  begin
    Wohnung := TImmObject.Create;
    Wohnungen.ImmObjects.Add(Wohnung);
  end;
end;

{Hier wird die Liste gelehrt}
procedure TForm1.Button2Click(Sender: TObject);
begin
  Wohnungen.Clear;
end;
  Mit Zitat antworten Zitat