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