簡體   English   中英

我可以使用.Create(Nil)代替.Create(應用程序)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM