全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2008
推到 Plurk!
推到 Facebook!

泛型tobjectdictionary怎樣釋放記憶體?

答題得分者是:tick228
wangccw
一般會員


發表:16
回覆:32
積分:14
註冊:2005-01-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-07-02 21:30:08 IP:210.63.xxx.xxx 訂閱
最近由 D6 轉到 D2010 ,之前d6 泛型及雜湊表 都是使用  jcl 的 TjclStrHashMap 及 TjclVector ,現在剛接觸 2010 ,看到它有泛型之後就來試試看了,可以的話就可以捨棄jcl的 TjclStrHashMap了。
但我發現它會有記憶體釋放的問題,附件是我的測試程式,一直按下 button1 ,記體會明顯的增加,可是我明明有呼叫 tobjectdictionary.clear,將放在 tobjectdictionary 內的物件清除掉了啊,為何記憶體還會持續增加??

請各位大德指點一下我哪裡有寫錯,謝謝。
附加檔案:4ff1a260123d2_test.rar
leveon
資深會員


發表:29
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-07-02 22:40:21 IP:111.240.xxx.xxx 訂閱
Clear只是將容器清空 ,物件還在記憶體中 
在容器清空前 手動Free即可

for I := 0 to date.Count-1 do begin
date.Items[I].Free;
end;
date.Clear;

另外 推薦你可以使用Fastmm4 檢查記憶體有沒有洩漏

===================引 用 wangccw 文 章===================
最近由 D6 轉到 D2010 ,之前d6 泛型及雜湊表 都是使用 jcl 的 TjclStrHashMap 及 TjclVector ,現在剛接觸 2010 ,看到它有泛型之後就來試試看了,可以的話就可以捨棄jcl的 TjclStrHashMap了。
但我發現它會有記憶體釋放的問題,附件是我的測試程式,一直按下 button1 ,記體會明顯的增加,可是我明明有呼叫 tobjectdictionary.clear,將放在 tobjectdictionary 內的物件清除掉了啊,為何記憶體還會持續增加??

請各位大德指點一下我哪裡有寫錯,謝謝。
wangccw
一般會員


發表:16
回覆:32
積分:14
註冊:2005-01-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-07-03 00:34:15 IP:112.104.xxx.xxx 訂閱
jcl 的 TjclStrHashMap 可以設定是否要讓自已管理物件,亦即當 TjclStrHashMap.clear 之後,裡面存放的物件會自動 free 掉。
tobjectdictionary 還要手動清除物件,這樣實在不怎麼優。

另外 delphi 2010 是否還需要 Fastmm4 來加強管理記憶體 ?


編輯記錄
wangccw 重新編輯於 2012-07-02 10:37:02, 註解 無‧
tick228
中階會員


發表:1
回覆:27
積分:50
註冊:2003-11-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-07-03 04:11:39 IP:101.13.xxx.xxx 未訂閱
Hi,

TObjectDictionary 有另提供多種 constructor Create(),

你要的功能, 只要將

date := TObjectdictionary.create;

這行改為下列方式

date := TObjectdictionary.create([doOwnsValues]);

即可達到,.

可參考 Help 裏的說明.

===================引 用 wangccw 文 章===================
jcl 的 TjclStrHashMap 可以設定是否要讓自已管理物件,亦即當 TjclStrHashMap.clear 之後,裡面存放的物件會自動 free 掉。
tobjectdictionary 還要手動清除物件,這樣實在不怎麼優。

另外 delphi 2010 是否還需要 Fastmm4 來加強管理記憶體 ?


wangccw
一般會員


發表:16
回覆:32
積分:14
註冊:2005-01-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-07-03 10:43:14 IP:210.63.xxx.xxx 訂閱
謝謝 tick228 , leveon 的回覆:
的確只要create時加上[doownsValues],即可解決這個問題。

感謝~~

===================引 用 tick228 文 章===================
Hi,

TObjectDictionary 有另提供多種 constructor Create(),

你要的功能, 只要將

date := TObjectdictionary
系統時間:2017-10-18 19:12:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!