Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObjectList.OwnsObjects (https://www.delphipraxis.net/149131-tobjectlist-ownsobjects.html)

hansmaad 15. Mär 2010 10:03


TObjectList.OwnsObjects
 
Halloo,

aus der Dokumentation:

Zitat:

Description

OwnsObjects allows TObjectList to control the memory of its objects. If OwnsObjects is True (the default),

calling Delete or Remove frees the deleted object in addition to removing it from the list.
calling Clear frees all the objects in the list in addition to emptying the list.
calling the destructor frees all the objects in the list in addition to destroying the TObjectList itself.
assigning a new value to an index in Items frees the object that previously occupied that position in the list.
Den letzten Punkt verstehe ich so, dass ich schreiben kann
Delphi-Quellcode:
  L := TObjectList.Create();
  L.Add(Test.Create(1));
  L[0] := Test.Create(2);
  L.Free;
Bei der Zuweisung wird aber kein Destructor aufgerufen und beim Löschen der Liste gibt es eine AccessViolation.
Delphi-Quellcode:
  L := TObjectList.Create();
  L.Add(Test.Create(1));
  L[0] := nil;
  L[0] := Test.Create(2);
  L.Free;
verhindert die Zugriffsverletzung, doch wird A immer noch nicht gelöscht.
Habe ich da was falsch verstanden?
Das nächste Beispiel

Delphi-Quellcode:
  L := TObjectList.Create();
  L.Add(Test.Create(1));
  L[0].Free;
  L[0] := Test.Create(2);
  L.Free;
Hier wird dtor 1 aufgerufen und dann 2mal dtor 2 !? Ein erneuter Afuruf der Funktion führt wieder zu einer Zugriffsverletzung. Einwandfrei funktioniert nur:

Delphi-Quellcode:
  L := TObjectList.Create();
  L.Add(Test.Create(1));
  L[0].Free;
  L[0] := nil;
  L[0] := Test.Create(2);
  L.Free;
Was aber heißt denn dann:
Zitat:

assigning a new value to an index in Items frees the object that previously occupied that position in the list

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;

Uwe Raabe 15. Mär 2010 10:19

Re: TObjectList.OwnsObjects
 
Funktioniert hier unter D5 und D2010 einwandfrei.

Panthrax 15. Mär 2010 10:23

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:

Uwe Raabe 15. Mär 2010 10:29

Re: TObjectList.OwnsObjects
 
Zitat:

Zitat von Panthrax
Edith sagt ich habe Blödsinn geschrieben. :drunken:

Ist Edith die Schwester von Else?

Panthrax 15. Mär 2010 10:39

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. ;-)

Uwe Raabe 15. Mär 2010 10:43

Re: TObjectList.OwnsObjects
 
Der Vollständigkeit halber der Code, den ich zum Testen benutze:

Delphi-Quellcode:
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;
Die Meldungen sind dann:
A
create 1
B
create 2
destroy 1
C
destroy 2
D

Stevie 15. Mär 2010 11:38

Re: TObjectList.OwnsObjects
 
Zitat:

Zitat von Uwe Raabe
Der Vollständigkeit halber der Code, den ich zum Testen benutze:

Delphi-Quellcode:
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;
Die Meldungen sind dann:
A
create 1
B
create 2
destroy 1
C
destroy 2
D

Das sieht doch alles korrekt aus, wo ist bei diesem Beispiel denn der Fehler bei dir?

Uwe Raabe 15. Mär 2010 11:50

Re: TObjectList.OwnsObjects
 
Bei mir ist eben kein Fehler...

Stevie 15. Mär 2010 11:52

Re: TObjectList.OwnsObjects
 
Zitat:

Zitat von Uwe Raabe
Bei mir ist eben kein Fehler...

Du != TE :wall: :oops:

hansmaad 15. Mär 2010 12:13

Re: TObjectList.OwnsObjects
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe
Die Meldungen sind dann:
A
create 1
B
create 2
destroy 1
C
destroy 2
D

Vielen Dank dafür schonmal :hi:
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.
Seite 1 von 2  1 2      

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