AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList.OwnsObjects

Ein Thema von hansmaad · begonnen am 15. Mär 2010 · letzter Beitrag vom 17. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#1

TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:03
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#2

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:19
Funktioniert hier unter D5 und D2010 einwandfrei.
Uwe Raabe
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:23
Die Implementierung sollte erreichbar sein, mit Strg-Mausklick auf "TObjectList".

Zu dem anderen hat mir Edith gerade gesagt, ich habe Blödsinn geschrieben.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#4

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:29
Zitat von Panthrax:
Edith sagt ich habe Blödsinn geschrieben.
Ist Edith die Schwester von Else?
Uwe Raabe
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#5

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:39
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.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#6

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 10:43
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
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 11:38
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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#8

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 11:50
Bei mir ist eben kein Fehler...
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.009 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 11:52
Zitat von Uwe Raabe:
Bei mir ist eben kein Fehler...
Du != TE
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
hansmaad

Registriert seit: 25. Feb 2010
52 Beiträge
 
Delphi 2010 Professional
 
#10

Re: TObjectList.OwnsObjects

  Alt 15. Mär 2010, 12:13
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
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
Angehängte Dateien
Dateityp: zip ownsobjects_165.zip (162,8 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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