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

觀念問題--關於Form 釋放後是否仍佔記憶體資源?

尚未結案
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-09 20:27:08 IP:192.168.xxx.xxx 未訂閱
請看以下的程式 Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 還是一定要在bForm的 caFree; Form2 := nil; 才可以呢! 在深度論壇中看到上述的討論,站長有點迷惑了,想請問大家的看法! 謝謝指導! ~~~Delphi K.Top討論區站長~~~ 發表人 - ddy 於 2002/11/28 14:19:46
------
~~~Delphi K.Top討論區站長~~~
鈴鐺
初階會員


發表:33
回覆:81
積分:35
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-09 20:56:31 IP:192.72.xxx.xxx 未訂閱
我改成這樣, 才不會有 compile warning. bForm := TbForm.Create(Application.Owner); Try bForm.ShowModal; Finally bForm.Free; end;    另外, 我猜, 應該是不用特別寫 quote>引言: 請看以下的程式 Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 還是一定要在bForm的 caFree; Form2 := nil; 才可以呢! 在深度論壇中看到上述的討論,站長有點迷惑了,想請問大家的看法! 謝謝指導! ~~~Delphi K.Top討論區站長~~~
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-09 21:05:00 IP:192.168.xxx.xxx 未訂閱
引言: 我改成這樣, 才不會有 compile warning. bForm := TbForm.Create(Application.Owner); Try bForm.ShowModal; Finally bForm.Free; end; 另外, 我猜, 應該是不用特別寫 quote> 謝謝鈴鐺兄回覆,您說的 Library 叫做什麼? 是Delphi附的Tools嗎? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-07-09 21:19:10 IP:211.23.xxx.xxx 未訂閱
引言:
引言: 我改成這樣, 才不會有 compile warning. bForm := TbForm.Create(Application.Owner); Try bForm.ShowModal; Finally bForm.Free; end; 另外, 我猜, 應該是不用特別寫 quote> 謝謝鈴鐺兄回覆,您說的 Library 叫做什麼? 是Delphi附的Tools嗎? ~~~Delphi K.Top討論區站長~~~
MemProof 可參考http://www.automatedqa.com/ @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-10 11:27:30 IP:210.200.xxx.xxx 未訂閱
引言: 請看以下的程式 Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 還是一定要在bForm的 caFree; Form2 := nil; 才可以呢! 在深度論壇中看到上述的討論,站長有點迷惑了,想請問大家的看法!
第一種方法是自己 Create 自己 Free, 萬一忘了 Form.Free 會出現 memory leak 現象. 第二種方法是自己 Create 而由此 Form 自己 Free, 所以結束此 Form 後就無法讓其他 Form 存取這個 Form 的東西. 另外若物件 Free 掉後要再設為 nil 可以用 FreeAndNil(Form2);
------
將問題盡快結案也是一種禮貌!
00156
高階會員


發表:45
回覆:195
積分:112
註冊:2002-06-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-07-10 11:59:09 IP:61.56.xxx.xxx 未訂閱
我做了小小的測試,在程式碼加入了一行:
Try
 bForm := TbForm.Create(Application.Owner);
 bForm.ShowModal;
Finally
 bForm.Free;
end;
bForm.ShowModal; //測試bForm是否還存在
果真,只要將caFree; 或 bForm.Free; 程式在測試那行都會出錯,除非兩個敘述都拿掉。因此,這兩種方式應該都能釋放記憶體。 另外,在Help裡說明: caFree : The form is closed and all allocated memory for the form is freed. .
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-07-10 12:23:10 IP:192.168.xxx.xxx 未訂閱
感謝andersonhsieh,danny,00156等會員的回覆, 這樣我對自己的觀念又踏實許多,謝謝! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-07-14 19:12:27 IP:203.217.xxx.xxx 未訂閱
try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 以上應該是最標準寫法,記憶體已free 若加上一行bForm:=nil; 是將bform這個變數之內容填入0, (i.e)不再指向任何adress, 故若bform是local變數則無須要. 在bForm的 caFree;Form2 := nil;則通常在不showmodal之form由於無機會free故寫在onclose, 當然modal form也可如此 ~~~Delphi K.Top討論區站長~~~ [/quote]
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-07-26 16:50:45 IP:211.23.xxx.xxx 未訂閱
Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 我想這主要是看你TbForm是怎麼寫的 如果寫不好就算把 Action := caFree; Form2 := nil; 還是沒有用 接下來解釋程式碼 bForm := TbForm.Create(Application.Owner); 這一行表示bForm的owner是application 所以你若忘記把bForm free掉,沒關係, 當application terminate的時候,application也會自已把bForm free 掉 而free的功能就是"如果不是nil 的話就呼叫解構函式" 所以第五行 bForm.Free 就是呼叫解構函式,如果你是在design time時做的那你不用擔心上面的元件 因為bForm在design time做的時候, 上面有使用到所有元件的owner預設就是bForm,因此當bForm.free執行時 自然會把所有在上面的元件也清掉, 不過若你在bForm還有其他的記憶體使用記得都要自已在destructor裡面把 其free 掉,不然bForm.free並不會幫你把這些記憶體free掉 若你的bForm是在run time的時候做的,那你記得其上面的元件在create時 要把owner設為bForm,這樣當bForm.free執行的時候才會幫你free掉其上面的元件 當然若還有其他的記憶體使用還是要在destructor的時候把其free掉 所以重點在於destructor要寫好 ps:有些地方的free應改為dispose比較恰當,因為不是物件
dky
一般會員


發表:12
回覆:30
積分:13
註冊:2004-06-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-02-22 12:33:24 IP:114.32.xxx.xxx 訂閱

===================引 用 ccchen 文 章===================
try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 以上應該是最標準寫法,記憶體已free 若加上一行bForm:=nil; 是將bform這個變數之內容填入0, (i.e)不再指向任何adress, 故若bform是local變數則無須要. 在bForm的 caFree;Form2 := nil;則通常在不showmodal之form由於無機會free故寫在onclose, 當然modal form也可如此 ~~~Delphi K.Top討論區站長~~~ [/quote]

Dear All,
最近我也在抓一個怪問題, 我用A Form去Create B Form, 每當Create B並關閉B後, 用工作管理員追蹤記憶狀況, 發現即使B Form在Close時有Free也nil了, 還是殘留了20~40K的記憶體沒釋放掉哩, 請問要如何才能把B Form完全釋放乾淨呢?
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-02-24 00:28:52 IP:114.43.xxx.xxx 訂閱
回樓上, 把 formB free 掉, 並不能保證在裏頭宣告的記憶體都被放掉, 例如你在 OnFormCreate 中使用 GetMem , 若未自行 FreeMem, 則你把form Free 後, 用 GetMem取得的記憶體並不會被釋放.
------
水瓶男的blog: http://791909.blogspot.com
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2010-02-24 08:01:52 IP:59.125.xxx.xxx 訂閱
我想如果這兩種途徑都無法完全釋放,同時自己也無另外宣告記憶體空間使用

明明就是釋放記憶體空間而已,應該很簡單
所以如果標準說明/操作手冊中的官方作法,無法正確釋放
那應該是 Delphi 本身設計上的瑕疵 / BUG



===================引 用 ccchen 文 章===================
try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 以上應該是最標準寫法,記憶體已free 若加上一行bForm:=nil; 是將bform這個變數之內容填入0, (i.e)不再指向任何adress, 故若bform是local變數則無須要. 在bForm的 caFree;Form2 := nil;則通常在不showmodal之form由於無機會free故寫在onclose, 當然modal form也可如此 ~~~Delphi K.Top討論區站長~~~ [/quote]
dky
一般會員


發表:12
回覆:30
積分:13
註冊:2004-06-24

發送簡訊給我
#13 引用回覆 回覆 發表時間:2010-02-24 14:09:02 IP:114.32.xxx.xxx 訂閱
我寫的測試程式, 在FormB中並沒有再GetMem取得其他記憶體.
扒了一些網文, 有的說是Delphi一些VCL元件本身就有Bug, 像Form.pas, controls.pas等等
不曉得跟這個有沒有關係.......
目前被這問題困擾中~~

===================引 用 aquarius 文 章===================
回樓上, 把 formB free 掉, 並不能保證在裏頭宣告的記憶體都被放掉, 例如你在 OnFormCreate 中使用 GetMem , 若未自行 FreeMem, 則你把form Free 後, 用 GetMem取得的記憶體並不會被釋放.
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2010-02-25 21:22:21 IP:60.250.xxx.xxx 訂閱

試了一下, form Free 被佔用的記憶空間, 並不是固定值, 有可能是因為記憶體管理機制用了某些空間點 Buffer 或 cache , 導到佔用量沒放出來. 若是 VCL 本身的問題, 因該同樣的動作執行 1000 次後, 會佔用100倍的記憶體, 但實際上並不會.

寫了一個測試程式, 在執行 form2 的 create 和 free 前, project1.exe 佔用記憶體為 3988KB, 執行一次後, 變成4032KB, 多了44KB, 但是再執行 100 次, 記憶體的佔用為 4036KB, 僅多 4KB 可見不是 Memoey Leak 造成記憶體未被放開, 而是系統記憶體管理問題. 此種狀況對正常使用不會有什麼不好的影響.

測試用的程式碼如下
[code delphi]
Procedure TForm1.Button1Click(sender:TObject);
var
i : integer ;
begin
for i:=1 to SpinEdit1.value do
begin
form2:=TForm2.Create(nil) ;
form2.caption:=inttostr(i) ;
form2.show ;
sleep(500) ;
form2.free ;
end ;
end ;

[/code]


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