觀念問題--關於Form 釋放後是否仍佔記憶體資源? |
尚未結案
|
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
請看以下的程式
Try
bForm := TbForm.Create(Application.Owner);
bForm.ShowModal;
Finally
bForm.Free;
end;
這樣bForm還會佔用記憶體資源嗎?
還是一定要在bForm的onClose()事件中加上
Action := caFree;
Form2 := nil;
才可以呢!
在深度論壇中看到上述的討論,站長有點迷惑了,想請問大家的看法!
謝謝指導! ~~~Delphi K.Top討論區站長~~~ 發表人 - ddy 於 2002/11/28 14:19:46
------
~~~Delphi K.Top討論區站長~~~ |
鈴鐺
初階會員 ![]() ![]() 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
我改成這樣, 才不會有 compile warning.
bForm := TbForm.Create(Application.Owner);
Try
bForm.ShowModal;
Finally
bForm.Free;
end; 另外, 我猜, 應該是不用特別寫 onClose().
記憶體是否釋放完全, 我記得有工具(library)可以幫忙查.
引言: 請看以下的程式 Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 還是一定要在bForm的onClose()事件中加上 Action := caFree; Form2 := nil; 才可以呢! 在深度論壇中看到上述的討論,站長有點迷惑了,想請問大家的看法! 謝謝指導! ~~~Delphi K.Top討論區站長~~~ |
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
引言: 我改成這樣, 才不會有 compile warning. bForm := TbForm.Create(Application.Owner); Try bForm.ShowModal; Finally bForm.Free; end; 另外, 我猜, 應該是不用特別寫 onClose(). 記憶體是否釋放完全, 我記得有工具(library)可以幫忙查.謝謝鈴鐺兄回覆,您說的 Library 叫做什麼? 是Delphi附的Tools嗎? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~ |
andersonhsieh
版主 ![]() ![]() ![]() ![]() ![]() 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
引言:MemProof 可參考http://www.automatedqa.com/ @@~~飛翔在天際的精靈~~@@引言: 我改成這樣, 才不會有 compile warning. bForm := TbForm.Create(Application.Owner); Try bForm.ShowModal; Finally bForm.Free; end; 另外, 我猜, 應該是不用特別寫 onClose(). 記憶體是否釋放完全, 我記得有工具(library)可以幫忙查.謝謝鈴鐺兄回覆,您說的 Library 叫做什麼? 是Delphi附的Tools嗎? ~~~Delphi K.Top討論區站長~~~
------
@@~~飛翔在天際的精靈~~@@ |
danny
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言: 請看以下的程式 Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 這樣bForm還會佔用記憶體資源嗎? 還是一定要在bForm的onClose()事件中加上 Action := 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 發送簡訊給我 |
我做了小小的測試,在程式碼加入了一行:
Try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; bForm.ShowModal; //測試bForm是否還存在果真,只要將onClose裡加入 Action:=caFree; 或 bForm.Free; 程式在測試那行都會出錯,除非兩個敘述都拿掉。因此,這兩種方式應該都能釋放記憶體。 另外,在Help裡說明: caFree : The form is closed and all allocated memory for the form is freed. . |
領航天使
站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:12216 回覆:4186 積分:4084 註冊:2001-07-25 發送簡訊給我 |
|
ccchen
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
try
bForm := TbForm.Create(Application.Owner);
bForm.ShowModal;
Finally
bForm.Free;
end;
以上應該是最標準寫法,記憶體已free
若加上一行bForm:=nil; 是將bform這個變數之內容填入0, (i.e)不再指向任何adress, 故若bform是local變數則無須要. 在bForm的onClose()事件中加上Action := caFree;Form2 := nil;則通常在不showmodal之form由於無機會free故寫在onclose, 當然modal form也可如此 ~~~Delphi K.Top討論區站長~~~
[/quote]
|
天外來客
初階會員 ![]() ![]() 發表:22 回覆:199 積分:44 註冊:2001-11-27 發送簡訊給我 |
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 發送簡訊給我 |
===================引 用 ccchen 文 章=================== try bForm := TbForm.Create(Application.Owner); bForm.ShowModal; Finally bForm.Free; end; 以上應該是最標準寫法,記憶體已free 若加上一行bForm:=nil; 是將bform這個變數之內容填入0, (i.e)不再指向任何adress, 故若bform是local變數則無須要. 在bForm的onClose()事件中加上Action := 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 發送簡訊給我 |
|
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
我想如果這兩種途徑都無法完全釋放,同時自己也無另外宣告記憶體空間使用
明明就是釋放記憶體空間而已,應該很簡單 所以如果標準說明/操作手冊中的官方作法,無法正確釋放 那應該是 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的onClose()事件中加上Action := caFree;Form2 := nil;則通常在不showmodal之form由於無機會free故寫在onclose, 當然modal form也可如此 ~~~Delphi K.Top討論區站長~~~ [/quote] |
dky
一般會員 ![]() ![]() 發表:12 回覆:30 積分:13 註冊:2004-06-24 發送簡訊給我 |
我寫的測試程式, 在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 發送簡訊給我 |
試了一下, 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |