自动化对象泄漏内存(TConnectionPoints)
问题描述:
我有一个自动化对象,具有泄漏内存的事件支持。生成的源自带的FConnectionPoints永远不会被释放。当我在析构函数中手动添加FConnectionPoints.Free时,泄漏消失。自动化对象泄漏内存(TConnectionPoints)
我在Delphi 7上,使用FastMM BorlandMM.dll和FastMM_Fulldebugmode.dll。
重现步骤:
- 启动一个新的ActiveX库项目
- 添加一个新的自动化对象:名称=的TestObject;检查“生成事件支持代码”
- 打开TypeLibrary,向ITestObject添加方法,向ITestObjectEvents添加事件
- 刷新,将生成代码。
- 添加ShareMem作为第一部在.dpr文件
- 保存,编译并注册该ActiveX服务器(运行菜单)
- 开始一个新的应用程序项目
- 将ShareMem作为第一部在.dpr文件
- 导入类型库单元:创建一个从你刚刚在步骤6,创建DLL单位,并勾选“生成部件的包装材料”
- 在你FORMCREATE添加以下代码:
代码:
var
lTest: TTestObject;
begin
lTest := TTestObject.Create(nil);
try
lTest.ConnectKind := ckNewInstance;
lTest.Connect;
lTest.Disconnect;
finally
lTest.Free;
end;
end;
现在编译,运行并关闭此应用程序。内存泄漏将被报告。
问:
这是在Delphi的代码模板中的错误,我在做成才错了,或者是旨在免费FConnectionPoints自己(的帮助并没有提到它)?
答
我发现此问题将在Quality Central report #1480中报告。
一个Sysop要求我创建一个新的报告,所以我这样做:report #81288。
这也回答了我的问题:它是代码模板中的一个错误。
答
我没有完全理解这个问题,因为我从来没有使用过自动化对象,但据我所见,IConnectionPoint
是一个接口。 Delphi中的接口是参考计数的(如果实现继承于TInterfacedObject
,TContainedObject
或TAgreggatedObject
或相应地实现_AddRef
和_Release
),所以应该没有内存泄漏。
有关界面的更多信息请看article。
TConnectionPoints不是一个接口对象,它只是一个继承TObject的对象。 FConnectionPoints作为实现IConnectionPointContainer的属性返回。 – 2010-01-08 15:27:43