AGB  ·  Datenschutz  ·  Impressum  







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

TDictionary objekte werden nicht freigegeben

Ein Thema von Kostas · begonnen am 2. Okt 2012 · letzter Beitrag vom 2. Okt 2012
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 13:24
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
Benutzerbild von zyklame
zyklame

Registriert seit: 26. Aug 2005
Ort: Berlin
2 Beiträge
 
#2

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 13:52
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.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 13:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 14:03
Verwende doch TObjectDictionary.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 14:08
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 14:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 14:28
Du musst den Contruktor bei TObjectDictionary mit den passenden Ownerships aufrufen, sonst hast Du wieder nur ein TDictionary.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: TDictionary objekte werden nicht freigegeben

  Alt 2. Okt 2012, 14:34
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.

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

Gruß Kostas

Geändert von Kostas ( 3. Okt 2012 um 00:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 09: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