代码之家  ›  专栏  ›  技术社区  ›  The_Fox

自动化对象泄漏内存(t连接点)

  •  -1
  • The_Fox  · 技术社区  · 15 年前

    我有一个带有事件支持的自动化对象,它泄漏内存。与生成的源一起提供的fcConnectionPoints永远不会释放。当我手动添加fconnectionpoints.free在析构函数中时,泄漏会消失。

    我在Delphi7上,使用fastmmborlandm.dll和fastmm fulldebugmode.dll。

    复制步骤:

    1. 启动新的ActiveX库项目
    2. 添加新的自动化对象:name=testobject;选中“生成事件支持代码”
    3. 打开类型库,向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代码模板中的一个bug,是我做错了什么,还是它打算释放fconnectionpoints(帮助没有提到它)?

    2 回复  |  直到 14 年前
        1
  •  1
  •   jpfollenius Rob Kennedy    15 年前

    我不完全理解这个问题,因为我从未使用过自动化对象,但据我所见 IConnectionPoint 是一个接口。Delphi中的接口被引用计数(如果实现继承自 TInterfacedObject , TContainedObject TAgreggatedObject 或器具 _AddRef _Release 因此,应该没有内存泄漏。

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

    这个 chapter from the Delphi Language Guide 也有帮助。

        2
  •  0
  •   The_Fox    15 年前

    我发现这个问题要在质量中心报告 report #1480 .

    一个系统操作员让我创建一个新报告,所以我做到了: report #81288 .

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