![]() |
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:
Gruß Kostas
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} |
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.
|
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 |
AW: TDictionary objekte werden nicht freigegeben
Verwende doch
![]() |
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; |
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 |
AW: TDictionary objekte werden nicht freigegeben
Du musst den Contruktor bei TObjectDictionary mit den passenden Ownerships aufrufen, sonst hast Du wieder nur ein TDictionary.
|
AW: TDictionary objekte werden nicht freigegeben
Zitat:
Danke für den Hinweis. [Edit] TObjectDictionary ist genau das richtige.
Delphi-Quellcode:
Dankeschön für den Hinweis.
TUserObjectDict := TObjectDictionary<integer, TUserObject>.Create([doOwnsValues]);
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