TObjectList.OwnsObjects
Halloo,
aus der Dokumentation: Zitat:
Delphi-Quellcode:
Bei der Zuweisung wird aber kein Destructor aufgerufen und beim Löschen der Liste gibt es eine AccessViolation.
L := TObjectList.Create();
L.Add(Test.Create(1)); L[0] := Test.Create(2); L.Free;
Delphi-Quellcode:
verhindert die Zugriffsverletzung, doch wird A immer noch nicht gelöscht.
L := TObjectList.Create();
L.Add(Test.Create(1)); L[0] := nil; L[0] := Test.Create(2); L.Free; Habe ich da was falsch verstanden? Das nächste Beispiel
Delphi-Quellcode:
Hier wird dtor 1 aufgerufen und dann 2mal dtor 2 !? Ein erneuter Afuruf der Funktion führt wieder zu einer Zugriffsverletzung. Einwandfrei funktioniert nur:
L := TObjectList.Create();
L.Add(Test.Create(1)); L[0].Free; L[0] := Test.Create(2); L.Free;
Delphi-Quellcode:
Was aber heißt denn dann:
L := TObjectList.Create();
L.Add(Test.Create(1)); L[0].Free; L[0] := nil; L[0] := Test.Create(2); L.Free; Zitat:
ps: gibt es irgendwo Dokumentationen wie TList und andere Standardelemente implementiert sind? ps2:
Delphi-Quellcode:
constructor test.create(n:Integer);
begin inherited create; n_ := n; end; destructor test.Destroy(); begin inherited; end; |
Re: TObjectList.OwnsObjects
Funktioniert hier unter D5 und D2010 einwandfrei.
|
Re: TObjectList.OwnsObjects
Die Implementierung sollte erreichbar sein, mit Strg-Mausklick auf "TObjectList".
Zu dem anderen hat mir Edith gerade gesagt, ich habe Blödsinn geschrieben. :drunken: |
Re: TObjectList.OwnsObjects
Zitat:
|
Re: TObjectList.OwnsObjects
Ich hatte es irgendwie geschafft, das "Test.Create(...)" zu überlesen, und war ganz ganz fest der Meinung, die Zugriffsverletzungen träten deshalb auf: TObject(1).Free; Aber gut, dass mich Edith noch darauf hingewieden hat, und ich den Beitrag vom Pflaster nehmen konnte, bevor irgendjemand etwas merkt. ;-)
|
Re: TObjectList.OwnsObjects
Der Vollständigkeit halber der Code, den ich zum Testen benutze:
Delphi-Quellcode:
Die Meldungen sind dann:
type
TTest = class private FID: Integer; protected property ID: Integer read FID; public constructor Create(AID: Integer); destructor Destroy; override; end; constructor TTest.Create(AID: Integer); begin inherited Create; FID := AID; ShowMessage(Format('create %d', [Id])); end; destructor TTest.Destroy; begin ShowMessage(Format('destroy %d', [Id])); inherited; end; procedure Test; var L: TObjectList; begin L := TObjectList.Create(); ShowMessage('A'); L.Add(TTest.Create(1)); ShowMessage('B'); L[0] := TTest.Create(2); ShowMessage('C'); L.Free; ShowMessage('D'); end; A create 1 B create 2 destroy 1 C destroy 2 D |
Re: TObjectList.OwnsObjects
Zitat:
|
Re: TObjectList.OwnsObjects
Bei mir ist eben kein Fehler...
|
Re: TObjectList.OwnsObjects
Zitat:
|
Re: TObjectList.OwnsObjects
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich habe das 1:1 kopiert. Meldungen bei mir: A create 1 B create 2 destroy 2 C EAccessViolation 'Access violation at adress xyz. Read of Adrees xyz' Delphi 5 Standard 5.62 auf Win XP 64 Pro |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz