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;