2010-01-08 67 views
-1

我有一個自動化對象,具有泄漏內存的事件支持。生成的源自帶的FConnectionPoints永遠不會被釋放。當我在析構函數中手動添加FConnectionPoints.Free時,泄漏消失。自動化對象泄漏內存(TConnectionPoints)

我在Delphi 7上,使用FastMM BorlandMM.dll和FastMM_Fulldebugmode.dll。

重現步驟:

  1. 啓動一個新的ActiveX庫項目
  2. 添加一個新的自動化對象:名稱=的TestObject;檢查「生成事件支持代碼」
  3. 打開TypeLibrary,向ITestObject添加方法,向ITestObjectEvents添加事件
  4. 刷新,將生成代碼。
  5. 添加ShareMem作爲第一部在.dpr文件
  6. 保存,編譯並註冊該ActiveX服務器(運行菜單)
  7. 開始一個新的應用程序項目
  8. 將ShareMem作爲第一部在.dpr文件
  9. 導入類型庫單元:創建一個從你剛剛在步驟6,創建DLL單位,並勾選「生成部件的包裝材料」
  10. 在你FORMCREATE添加以下代碼:

代碼:

var 
    lTest: TTestObject; 
begin 
    lTest := TTestObject.Create(nil); 
    try 
    lTest.ConnectKind := ckNewInstance; 
    lTest.Connect; 
    lTest.Disconnect; 
    finally 
    lTest.Free; 
    end; 
end; 

現在編譯,運行並關閉此應用程序。內存泄漏將被報告。

問:

這是在Delphi的代碼模板中的錯誤,我在做成才錯了,或者是旨在免費FConnectionPoints自己(的幫助並沒有提到它)?

回答

0

我發現此問題將在Quality Central report #1480中報告。

一個Sysop要求我創建一個新的報告,所以我這樣做:report #81288

這也回答了我的問題:它是代碼模板中的一個錯誤。

1

我沒有完全理解這個問題,因爲我從來沒有使用過自動化對象,但據我所見,IConnectionPoint是一個接口。 Delphi中的接口是參考計數的(如果實現繼承於TInterfacedObjectTContainedObjectTAgreggatedObject或相應地實現_AddRef_Release),所以應該沒有內存泄漏。

有關界面的更多信息請看article

chapter from the Delphi Language Guide也可以幫助。

+0

TConnectionPoints不是一個接口對象,它只是一個繼承TObject的對象。 FConnectionPoints作爲實現IConnectionPointContainer的屬性返回。 – 2010-01-08 15:27:43