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

try except 的記憶體管理問題

答題得分者是:RootKit
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-22 11:55:26 IP:61.67.xxx.xxx 未訂閱
請問各位!

我遇到一個在 form1.close 後會引發當機的問題, 查證為第三方控件所引發的, 但不清楚何者所觸發
我做了一個偷懶的做法, 就是在控件引發錯誤的的程式段加入
try
原第三方控件程式;
except
end;

這樣在form1.close 時, 雖然還是會有錯誤發生, 但因為有 excpet 不做任何事, 程式就可以避免引發當機(debug)畫面
但如果程式一直這樣的操作(close 的進出次數是很頻繁), 會不會造成記憶體上引發更大的問題呢?
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-22 13:16:10 IP:115.43.xxx.xxx 訂閱
Hello
1.若於 fom1.close 時發生問題,而第三方控件code,也寫於 close function 的話
改變 TCloseAction 是否能解決問題 ?? 觀看釋放順序,並改變,是否能解決問題呢??
2.利用 try except 後,不再有當機的情況發生,而發生的錯誤訊息內容為何?
3.於 try except 後,windows 工作管理員的程序有何變化呢? 是否該程式一樣沒釋放? 或多了一些小程序?
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-23 10:31:19 IP:61.67.xxx.xxx 未訂閱
這個控件是 TDOSMOVE
1.它不位於CLOSE中, 我是在一支程式兩個FORM(FORM1, FORM2)分別建置了一組DosMove1, DosMove2
Form2是 mailform, Form1 是一般的form, 程式啟動後先run form1, 再呼叫 form2, form2.close , 再form1.close 引發錯誤
2.try...except 不是不再發生當機, 還是有當機, 只是except 不做任何事, 所以感覺沒有當機
DosMove 引發的錯誤(紅色字段是原來的code)
try
if Assigned(FActiveControlChange) then FActiveControlChange(Sender);
except
end;
至於引發的錯誤, 我沒有記錄下來, 記得是 Access Error 問題
3.關於第3點沒有深入調查, 但 form1 的 exe 有被釋放, 其他是否有新增小程序, 不知道囉!

我現在用另一個方法做, 似乎就沒有上述的狀況
原本是直接把 vcl 拉下來到 form 上設置, 現在我改用在 form2 直接創建 TDosMove.Create(self)的方式來執行
功能還是可以維持一樣, 在 Form2.close , 我直接下 DosMove2.Destroy!
似乎沒有發生當機(當然我測試是把 TDosMove中的try ... except 拿掉)

===================引 用 AndrewK 文 章===================
Hello
1.若於 fom1.close 時發生問題,而第三方控件code,也寫於 close function 的話
改變 TCloseAction 是否能解決問題 ?? 觀看釋放順序,並改變,是否能解決問題呢??
2.利用 try except 後,不再有當機的情況發生,而發生的錯誤訊息內容為何?
3.於 try except 後,windows 工作管理員的程序有何變化呢? 是否該程式一樣沒釋放? 或多了一些小程序?
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-07-23 21:00:49 IP:122.126.xxx.xxx 訂閱
raise 所引發的例外錯誤,是不是記憶體會釋放。
要看程式碼的寫法,若有 Try..finally 當然不會有問題,若沒有建立後又引發錯誤中斷跳出就會導致物件沒有正確釋放。

通常如果在 Assigned 發生錯誤,可能是該指向物件的指針還在但物件卻已經不存在,就導致 Access Vilation

看一下就你的 Try.. Except 內容是不會引起記憶體洩漏,是很正常的作法。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-25 22:56:43 IP:61.67.xxx.xxx 未訂閱
謝謝指教, 目前我上述的做法, 我特別檢查記憶體的釋放上, 似乎查覺不到有異樣, 因為 dosmove 之前使用在兩個form上(用vcl放上來的方式), 常會造成兩個form 上的 dosmove 互相干擾, 所以改用 create 方式來創建, 在 form 消滅時, 看來是會被乾淨的摧毀(destory)而不會有後遺症, 暫時先結案了!
===================引 用 RootKit 文 章===================
raise 所引發的例外錯誤,是不是記憶體會釋放。
要看程式碼的寫法,若有 Try..finally 當然不會有問題,若沒有建立後又引發錯誤中斷跳出就會導致物件沒有正確釋放。

通常如果在 Assigned 發生錯誤,可能是該指向物件的指針還在但物件卻已經不存在,就導致 Access Vilation

看一下就你的 Try.. Except 內容是不會引起記憶體洩漏,是很正常的作法。
系統時間:2024-04-26 15:54:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!