![]() |
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
Postest du bitte mal deinen aktuellen Destruktor TStreamlist.destroy? :wink: |
Re: Zugriffsverletzung bei TObjectlist.delete
Hallo IngoD7,
ich habe mich in letzter Instanz entschieden, den Tip von Jelly angenommen. Daher habe ich jetzt keinen eigenen Destructor mehr, sondern den der Klasse TObjectlist. Den Test, nach dem du gefragt hast, habe ich vor diese letzten Änderung gemacht. Momentan sieht die Klasse so aus.
Delphi-Quellcode:
type TStreamlist= class (TObjectlist)
private function GetStream(Index: Integer): TStringstream; procedure PutStream(Index: Integer; const Value: TStringstream); public function add: integer;overload; function Add(Item:TStringstream):integer;overload; property items[Index: Integer]: TStringstream read GetStream write PutStream; end; implementation function TStreamlist.add: integer; var TagType: TStringstream; begin TagType:=TStringstream.Create(''); Result:= inherited add(TagType); end; function TStreamlist.Add(Item: TStringstream): Integer; begin Result:= inherited add(item); end; function TStreamlist.GetStream(Index: Integer):TStringstream; begin; result:= TStringstream(inherited Items[Index]); end; procedure TStreamlist.PutStream(Index: Integer; const Value: TStringstream); begin inherited items[Index]:=Value; end; end. |
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
Delphi-Quellcode:
function TStreamlist.add: integer;
begin Result:= inherited add(TStringstream.Create('')); end; |
Re: Zugriffsverletzung bei TObjectlist.delete
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:
Delphi-Quellcode:
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.
procedure TStreamlist.clear;
begin FStreamObjectList.Clear; end; 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:
Aber wie schon geschrieben: Der ganze Code ist hyperfluid: TObjectList.Clear() macht das alles schon intern!
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 Achim |
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
|
Re: Zugriffsverletzung bei TObjectlist.delete
Zitat:
Das ist neu. Das hättest du zwischendurch mal schreiben können. :? Dann hätte ich mir auch Tipparbeit sparen können. :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz