程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中對象解除技巧

Delphi中對象解除技巧

編輯:Delphi

在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時,對象引用將仍然引用對象解除之前所占用的內存地址,這就是產生錯誤的原因。

當然,在實際開發過程中,大多數錯誤不會這樣明顯,解決的方法也要依具體而定,不會這麼簡單地加一句話就能解決問題。我在這裡只是說明一種編程思想,起一個拋磚引玉的作用,具體的東西還要靠你在實踐中去探索,積累。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved