Hallo,
ich hab' jetzt nicht alle Antworten gelesen und weiß auch nicht, was dieses Konstrukt genau anstellen soll. Aber das hier springt mir doch ins Auge:
Zitat von
ozz:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
while FStreamObjectList.Count >0 do
begin
FStreamObjectList.Delete(0);
end;
end;
Warum machst Du nicht einfach folgendes:
Delphi-Quellcode:
procedure TStreamlist.clear;
begin
FStreamObjectList.Clear;
end;
Das löscht ebenfalls alle Objekte in FStreamObjectList. Und da FStreamObjectList der Eigentümer aller enthaltener Objekte ist, werden diese alle auch vorher brav mit Free freigegeben.
Wenn Du das -- aus irgend einem Grund -- trotzdem "von Hand" machen möchtest, dann musst Du nach dem Free() den Eintrag in der Liste auf NIL setzen. Der nachfolgende Aufruf von Clear() durchläuft ja intern noch einmal die Liste und versucht, die Items freizugeben... *Bumm*. Dass die Items von Dir schon freigeben wurden, kann die Liste ja nicht wissen.
Delphi-Quellcode:
destructor TStreamlist.destroy;
var i:Integer;
begin;
for i:= FStreamObjectList.Count-1 downto 0 do // Rückwärts laufen
begin
FStreamObjectList.Items[i].free // jedes einzelne Objekt expl. freigeben
FStreamObjectList.Items[i] := nil; // Referenz entfernen!!!
end;
FStreamObjectList.Clear(); // Alle Items entfernen.
inherited Destroy; // und zum Schluss noch das Basisdestroy
Aber wie schon geschrieben: Der ganze Code ist hyperfluid: TObjectList.Clear() macht das alles schon intern!
Achim