![](/img/trans.png)
[英]Delphi 7 - When to use .create(Application) and when to use .create(nil)?
[英]Can I use .Create(Nil) instead of .Create(Application)
我有一個具有TComponent變量的單元,我在單元初始化時創建這個組件,如下所示:
var
XComp: TComponent;
.
.
.
.
initialization
begin
XCom := TComponent.Create(Application);
end;
我關閉Delphi后安裝單元后,它給我一個訪問沖突錯誤消息(EAccessViolation)
但是當我改變我的創造者時如下
initialization
begin
XCom := TComponent.Create(nil);
end;
一切都很順利...我想知道區別嗎? 什么更好?
注意:只有在關閉delphi時才會出現錯誤(在設計時意味着)。
謝謝。
當你使用
XCom := TComponent.Create(Application);
您使應用程序成為XCom的所有者。 當應用程序終止時,它將負責銷毀XCom,因為它是所有者。
當你這樣做
XCom := TComponent.Create(nil);
沒有人是XCom的所有者,你必須在應用程序終止時自己釋放它。
您可能有異常,因為您手動釋放了XCom,然后Application也試圖釋放XCom。
基本上兩者都是允許的,即使你有這樣的代碼也不應該導致AV:
MyComp := TMyComp.Create(Application);
try
{...}
finally
MyComp.Free;
end;
這是因為正確編碼的組件在銷毀時會從其所有者的組件列表中刪除。
我認為這里的問題可能是組件已經被應用程序對象釋放,稍后一些代碼試圖訪問它。 也許你的代碼中有一個finalize部分,它可以嗎? 或者你可能有混合的對象和接口,引用計數得到你。
要調試您的問題,您可以通過將程序包的“主機應用程序”設置為Delphi(C:\\ Program Files \\\\ BDS \\\\ Bin \\ bds.exe)來在調試器中運行IDE。 並在組件的析構函數中設置斷點。 這樣你就可以找到它被釋放的位置以及AV發生的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.