Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TDictionary objekte werden nicht freigegeben (https://www.delphipraxis.net/170766-tdictionary-objekte-werden-nicht-freigegeben.html)

Kostas 2. Okt 2012 13:24

Delphi-Version: 5

TDictionary objekte werden nicht freigegeben
 
Hallo Zusammen,

ich habe soeben festgestellt dass Dictionary.Remove(0) den Destructor des Objectes nicht aufruft.

Oder ist es möglicherweise nicht notwendig weil ich keine Instanzvariable für das UserObject
verwende sondern direkt als Parameter das Object erzeuge?
Andernfalls müsste ich durch das komplette Disct. durchlaufen und selbst das UserObject zerstören.


Code:
procedure TfrmMain.CreateUserObjectDict;
var i,n:Integer;
    NS: WideString;
begin
  if Assigned(UserObjectDict)
  then DeleteUserObjectDict;

  UserObjectDict := TDictionary<integer, TUserObject>.Create;

  for i := 0 to FDataCtrl1.UserCount-1 do
  begin
    FDataCtrl1.GetExtension(i,NS);
    n := StrToIntDef(NS,-1);
    if (n>0)
    then UserObjectDict.AddOrSetValue(n, TUserObject.Create(i, NS) ); <<<UserObject erzeugen und ins Dict schreiben
  end;{for}
end;{CreateUserObjectDict}

procedure TfrmMain.DeleteUserObjectDict;
var i:Integer;
begin
  if not Assigned(UserObjectDict) then Exit;

  for i := 0 to UserObjectDict.Count-1
  do UserObjectDict.Remove(0);  <<< hier würde ich den Aufruf des TUserObject.Destructor erwarten

  UserObjectDict.TrimExcess;
  UserObjectDict.Free;
end;{DeleteUserObjectDict}
Gruß Kostas

zyklame 2. Okt 2012 13:52

AW: TDictionary objekte werden nicht freigegeben
 
Die Objekte die du in TDictionary hast musst du auch selber wieder freigeben. Das TDictionary hält nur die Referenzen und die Eigenschaft Owned scheint es nicht zu haben.

Kostas 2. Okt 2012 13:58

AW: TDictionary objekte werden nicht freigegeben
 
Hallo,

ich habe mich gewundert denn TObjectList<t> hat eine Methode Delete(0)
welche beim Aufruf den Destructor des Objektes aufruft. Deshalb wurdert es mich
warum das bei TDisctionary anders sein soll.

Nun, dann mach ich´s mir selbst. :-)

Dankeschön.
Gruß Kostas

Uwe Raabe 2. Okt 2012 14:03

AW: TDictionary objekte werden nicht freigegeben
 
Verwende doch TObjectDictionary.

Bummi 2. Okt 2012 14:08

AW: TDictionary objekte werden nicht freigegeben
 
ansonsten kannst Du nachrüsten
Delphi-Quellcode:
procedure TForm3.VNotify(Sender: TObject; const Item: Ttest; Action: TCollectionNotification);
begin
  if Action=cnRemoved then Item.Free;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 d:TDictionary<String,Ttest>;
begin
   d:=TDictionary<String,Ttest>.Create;

   try
     d.OnValueNotify := VNotify;
     d.Add('Test 1',TTest.Create('1. Wert'));
     d.Add('Test 2',TTest.Create('2. Wert'));
     d.Remove('Test 1');
   finally
     Showmessage('vor free') ;
     d.Free;
   end;
end;

Kostas 2. Okt 2012 14:22

AW: TDictionary objekte werden nicht freigegeben
 
oh es gibt auch ein TObjectDictionary, mal sehen ob das eine integrierte Putzfrau hat.
Das mit dem Event habe ich auch gesehen. Da meine Klasse zur Zeit aus reinen Wertetypen besteht,
wollte ich auf den Event verzichten.

Gruß Kostas

Bummi 2. Okt 2012 14:28

AW: TDictionary objekte werden nicht freigegeben
 
Du musst den Contruktor bei TObjectDictionary mit den passenden Ownerships aufrufen, sonst hast Du wieder nur ein TDictionary.

Kostas 2. Okt 2012 14:34

AW: TDictionary objekte werden nicht freigegeben
 
Zitat:

Zitat von Bummi (Beitrag 1185410)
Du musst den Contruktor bei TObjectDictionary mit den passenden Ownerships aufrufen, sonst hast Du wieder nur ein TDictionary.

Weis jetzt nicht genau was du meinst. Mal sehen ob ich in der Hilfe etwas darüber finde.
Danke für den Hinweis.

[Edit]
TObjectDictionary ist genau das richtige.

Delphi-Quellcode:
TUserObjectDict := TObjectDictionary<integer, TUserObject>.Create([doOwnsValues]);
Dankeschön für den Hinweis.

Gruß Kostas


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz