?? delphi對象釋放的技巧 (2001年4月5日).txt
字號:
Delphi對象釋放的技巧 (2001年4月5日)
網(wǎng)友更新 分類:數(shù)據(jù)庫 作者: winmon(推薦) 推薦:winmon 閱讀次數(shù):279
(http://www.codesky.net)
--------------------------------------------------------------------------------
在Delphi程序設(shè)計(jì)中,我們需要通過解除建立的所有對象來避免內(nèi)存泄漏。但是,如果你在程序中不謹(jǐn)慎小心的話,很容易多次解除同一個(gè)對象,這將會(huì)引起很嚴(yán)重的錯(cuò)誤,造成應(yīng)用程序崩潰,甚至是死機(jī)。
請看下面的程序:
procedure TForm1.Button1Click(Sender:TObject);
var
Button2,Button3:TButton;
begin
Button2:=TButton.Create(self);
Button3:=TButton.Create(Button2);
Button2.Free;
Button3.Free;
end;
在上例中,當(dāng)執(zhí)行到Button3.Free時(shí)會(huì)產(chǎn)生一個(gè)錯(cuò)誤,因?yàn)樵谡{(diào)用Button2.Free時(shí),Button2被解除,但因?yàn)锽utton2是Button3的宿主,Button3也同時(shí)被解除,因此錯(cuò)誤就不可避免地發(fā)生了。
要避免上述錯(cuò)誤,有兩種方法:第一,在解除宿主之前要先解除其所屬的所有組件。這種方法很簡單,只要將上例中Button2.Free和Button3.Free換位即可。第二,在Button3.Free執(zhí)行之前將Button3變量設(shè)置為nil。程序如下:
Button2.Free;
Button3:=nil;
Button3.Free;
在上面的程序中,將Button3置為nil是為了阻止應(yīng)用程序重新使用已解除對象的內(nèi)存。在調(diào)用Free對象方法時(shí),它會(huì)確定對象是否為nil,如果不是,F(xiàn)ree對象方法會(huì)假定對象仍然存在,使用對象引用為它分配內(nèi)存,然后調(diào)用Destroy釋放對象內(nèi)存,并清除任何相關(guān)的虛擬對象方法的數(shù)據(jù)表格信息。而Destroy對于有對象存在的內(nèi)存地址不會(huì)做任何改變,所以如果在調(diào)用Destroy之后測試該內(nèi)存地址,它仍可能有效。所以當(dāng)在程序中兩次調(diào)用一個(gè)對象而沒有將對象引用置為nil時(shí),對象引用將仍然引用對象解除之前所占用的內(nèi)存地址,這就是產(chǎn)生錯(cuò)誤的原因。
當(dāng)然,在實(shí)際開發(fā)過程中,大多數(shù)錯(cuò)誤不會(huì)這樣明顯,解決的方法也要依具體而定,不會(huì)這么簡單地加一句話就能解決問題。我在這里只是說明一種編程思想,起一個(gè)拋磚引玉的作用,具體的東西還要靠你在實(shí)踐中去探索,積累。
--------------------------------------------------------------------------------
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -