Delphi-Quellcode:
EinObjekt := TObject.Create();
EinObjekt.Name := '1';
Objektliste.Add(EinObjekt);
{EinObjekt.Destroy;
EinObjekt := nil; Das Objekt in der Liste geht auch verloren!}
EinObjekt := TObject.Create();
EinObjekt.Name := '2';
Objektliste.Add(EinObjekt);
Bei dem Code ist so in dieser Form erstmal kein Fehler drin (wenn man davon absieht, dass TObject keine Property Name hat), du kannst ohne Probleme sowas aufbauen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
LObjectList: TObjectList;
LObject: TObject;
begin
LObjectList := TObjectList.Create(True);
try
for i := 0 to 9 do
begin
LObject := TObject.Create();
LObject.Name := 'foo';
LObjectList.Add(LObject);
end;
finally
LObjectList.Free;
end;
end;
Bei TObjectList.Create wird der Parameter True übergeben, welcher bedeutet, dass beim freigeben der Objectliste auch alle dahinter liegenden Objecte mit freigegeben werden. Solltest du den parameterlosen Constructor aufrufen, geschieht dies ebenso.
Wenn du Instanzen von Objekten übergibst, übergibst du eigentlich nie das Objekt selber, sondern nur die Referenz auf die Speicheradresse wo das Objekt liegt. Daraus folgt, dass in der LObjectList und im LObject nur Zeiger auf ein und das selbe Objekt sind. Wenn du jetzt über einen dieser Zeiger das Objekt freigibst, dann zeigt die andere Referenz immer noch dahin, beim Aufrufen wirst du dort aber kein Objekt mehr finden.