2010-01-08 45 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