1)destroy:虛方法
釋放內存,在Tobject中聲明爲virtual,通常是在其子類中override 它,且要加上inherited關鍵字,才能保證派生類對象正確地被銷燬;
但destroy一般不能直接用,爲什麼?
當一個對象爲nil,我們仍然調用destroy,會產生錯誤。因爲destroy是虛方法,它要根據對象中的頭四個字節找到虛擬方法表Vmt的入口地址,從而找到destroy的入口地址,所以此時對象一定要存在。但free就是靜態方法,它根據對象引用/指針的類型來確定,即使對象本身不存在也不會產生異常,而且在free中有判斷對象是否存在的操作,
所以一般的情況下都用Free來釋放對象。
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;
Delphi中destroy, free, freeAndNil, release用法和區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
FastReport 程序員手冊
dgmars19841123
2018-08-27 17:38:30
FireMonkey的窗口Handle轉爲Windows窗口的Handle
newsxy
2018-08-27 17:20:40
Delphi XE6 學習筆記(9)手動填充ListView及ListBox
newsxy
2018-08-27 17:20:19
Delphi與VB有什麼區別?
java大豆
2018-08-27 17:20:19
Delphi XE5 將Delphi Code從WinOS 遷移到iOS與Android
newsxy
2018-08-27 17:20:07
保存流 出現錯誤:[FireDAC][Phys]-329. Cannot generate update query. WHERE condition is empty
newsxy
2018-08-27 17:20:07
用Delphi從內存流中判斷圖片格式
newsxy
2018-08-27 17:20:04
datasnap的初步
newsxy
2018-08-27 17:20:03
在 Android 的文字編輯控件 (TEdit) 中, 如何按下 Enter 就隱藏虛擬鍵盤
newsxy
2018-08-27 17:20:03
Thread: DataSnap - detect disgraceful disconnect
newsxy
2018-08-27 17:20:01
Delphi xe 下快捷使用 FastMM 的內存泄露檢測功能
newsxy
2018-08-27 17:20:01
Delphi XE7 beta1的新功能之TListView滑動刷新數據功能
newsxy
2018-08-27 17:20:00
Delphi使用AdoQuery調用Mysql存儲過程
小白2016plus
2018-08-27 16:38:49
Delphi 發佈ActiveX控件 數字簽名(轉)
小白2016plus
2018-08-27 16:38:49
C#首席設計師Anders Hejlsberg專訪
自由的企鹅
2018-08-27 16:01:10