-1

我有一个带有事件支持的自动化对象,它会泄漏内存。生成源附带的 FConnectionPoints 永远不会被释放。当我在析构函数中手动添加 FConnectionPoints.Free 时,泄漏就消失了。

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

重现步骤:

  1. 启动一个新的 ActiveX 库项目
  2. 添加一个新的自动化对象:Name = TestObject; 检查“生成事件支持代码”
  3. 打开TypeLibrary,给ITestObject添加一个方法,给ITestObjectEvents添加一个事件
  4. 刷新,将生成代码。
  5. 将 ShareMem 添加为 .dpr 文件中的第一个单元
  6. 保存、编译和注册这个 ActiveX Server(运行菜单)
  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(帮助没有提及)?

4

2 回答 2

1

我不完全理解这个问题,因为我从未使用过自动化对象,但据我所知IConnectionPoint是一个界面。Delphi 中的接口是引用计数的(如果实现继承自TInterfacedObject,TContainedObjectTAgreggatedObject或相应地实现) _AddRef_Release所以应该没有内存泄漏。

有关接口的更多信息,请查看这篇文章

Delphi 语言指南中的这一章也可以提供帮助。

于 2010-01-08T15:05:55.697 回答
0

我发现此问题已在 Quality Central报告 #1480中报告。

一位 Sysop 要求我创建一个新报告,所以我做了:report #81288

这也回答了我的问题:这是代码模板中的一个错误。

于 2010-01-20T16:03:06.140 回答