1. 程式人生 > >Delphi中destroy, free, freeAndNil, release用法和區別

Delphi中destroy, free, freeAndNil, release用法和區別

http://kudick.blog.163.com/blog/static/16660663200931311194482/

2009-04-13 11:19:04|  分類: Delphi相關|舉報|字號 訂閱

1)destroy:虛方法
釋放記憶體,在Tobject中宣告為virtual,通常是在其子類中override 它,且要加上inherited關鍵字,才能保證派生類物件正確地被銷燬;
但destroy一般不能直接用,為什麼?
假如當一個物件為nil,我們仍然呼叫destroy,此時會產生錯誤。因為destroy是虛方法,它要根據物件中的頭四個位元組找到虛擬方法表Vmt的入口地址,從而找到destroy的入口地址,所以此時物件一定要存在。但free就是靜態方法,它只需根據物件引用/指標的型別來確定,即使物件本身不存在也沒問題,而且在free中有判斷物件是否存在的操作, 所以用free比用destroy安全。
2)free:靜態方法
測試物件是否為nil, 非nil則呼叫destroy。下面是free的Delphi程式碼:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
一靜一動,取長補短,豈不妙哉!
但是呼叫物件的Destroy只是把物件銷燬了,但並沒有把物件的引用設為nil,這需要程式設計師來完成,不過自從Delphi5之後,在sysUtils單元中提供了一個freeAndNil。
3)freeAndNil;一般方法,非物件方法,非類方法。
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
建議大家用它代替free/Destroy,以便確保正確地釋放物件。
4)release;TcustomForm中定義的靜態方法。
當視窗中所有的事件處理完之後,才呼叫free函式。常用在銷燬視窗,而在這個視窗中事件處理需要一定的時間的時候,用這個方法能確保視窗事件處理完之後才銷燬視窗。下面是TCustomForm.Release的Delphi原始碼:
procedure TCustomForm.Release;
begin
PostMessage(Handle, CM_RELEASE, 0, 0);
//向視窗發CM_RELEASE訊息到訊息佇列,當所有的視窗事件訊息處理完之後,
//再呼叫CM_RELEASE訊息處理過程CMRelease 
end;
再看看下面CM_RELEASE訊息處理過程CMRelease的定義:
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
procedure TCustomForm.CMRelease;
begin
Free; //最後還是free; 
end;