【问题标题】:Automation object leaks memory (TConnectionPoints)自动化对象泄漏内存 (TConnectionPoints)
【发布时间】:2010-01-08 14:25:56
【问题描述】:

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

我在 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(帮助没有提及)?

【问题讨论】:

    标签: delphi memory-leaks automation iconnectionpoint


    【解决方案1】:

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

    有关接口的更多信息,请查看article

    这个chapter from the Delphi Language Guide 也可以提供帮助。

    【讨论】:

    • TConnectionPoints 不是接口对象,它只是一个继承 TObject 的对象。 FConnectionPoints 作为实现 IConnectionPointContainer 的属性返回。
    【解决方案2】:

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

    系统管理员让我创建一个新报告,所以我做了:report #81288

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

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2012-10-31
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2011-10-16
      • 2012-06-13
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多