在Delphi程序設計中我們需要通過解除建立的所有對象來避免內存洩漏但是如果你在程序中不謹慎小心的話很容易多次解除同一個對象這將會引起很嚴重的錯誤造成應用程序崩潰甚至是死機
請看下面的程序
procedure TForm
Button
Click(Sender:TObject);
var
Button
Button
:TButton;
begin
Button
:=TButton
Create(self);
Button
:=TButton
Create(Button
);
Button
Free;
Button
Free;
end;
在上例中當執行到ButtonFree時會產生一個錯誤因為在調用ButtonFree時Button被解除但因為Button是Button的宿主Button也同時被解除因此錯誤就不可避免地發生了
要避免上述錯誤有兩種方法第一在解除宿主之前要先解除其所屬的所有組件這種方法很簡單只要將上例中ButtonFree和ButtonFree換位即可第二在ButtonFree執行之前將Button變量設置為nil程序如下
Button
Free;
Button
:=nil;
Button
Free;
在上面的程序中將Button置為nil是為了阻止應用程序重新使用已解除對象的內存在調用Free對象方法時它會確定對象是否為nil如果不是Free對象方法會假定對象仍然存在使用對象引用為它分配內存然後調用Destroy釋放對象內存並清除任何相關的虛擬對象方法的數據表格信息而Destroy對於有對象存在的內存地址不會做任何改變所以如果在調用Destroy之後測試該內存地址它仍可能有效所以當在程序中兩次調用一個對象而沒有將對象引用置為nil時對象引用將仍然引用對象解除之前所占用的內存地址這就是產生錯誤的原因
當然在實際開發過程中大多數錯誤不會這樣明顯解決的方法也要依具體而定不會這麼簡單地加一句話就能解決問題我在這裡只是說明一種編程思想起一個拋磚引玉的作用具體的東西還要靠你在實踐中去探索積累
From:http://tw.wingwit.com/Article/program/Delphi/201311/8541.html