自动化对象泄漏内存(TConnectionPoints)

发布于 2024-08-17 04:55:11 字数 955 浏览 5 评论 0原文

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

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

重现步骤:

  1. 启动一个新的 ActiveX 库项目
  2. 添加一个新的自动化对象:Name = TestObject;勾选“生成事件支持代码”
  3. 打开TypeLibrary,向ITestObject添加一个方法,向ITestObjectEvents添加一个事件
  4. Refresh,代码就会生成。
  5. 将 ShareMem 添加为 .dpr 文件中的第一个单元
  6. 保存、编译并注册此 ActiveX 服务器(运行菜单)
  7. 启动一个新的应用程序项目
  8. 将 ShareMem 作为 .dpr 文件中的第一个单元
  9. 导入类型库单元:从 dll 创建单元您刚刚在步骤 6 中创建,并选中“生成组件包装器”。
  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(帮助中没有提及)?

I have an automation object with event support that leaks memory. The FConnectionPoints which comes with the generated source is never freed. When I manually add FConnectionPoints.Free in the destructor, the leak goes away.

I am on Delphi 7, using a FastMM BorlandMM.dll and FastMM_Fulldebugmode.dll.

Steps to reproduce:

  1. Start a new ActiveX Library project
  2. Add a new Automation Object: Name = TestObject; Check "Generate Event support code"
  3. Open the TypeLibrary, add a method to ITestObject, add an event to ITestObjectEvents
  4. Refresh, code will be generated.
  5. Add ShareMem as the first unit in your .dpr file
  6. Save, compile and register this ActiveX Server (Run menu)
  7. Start a new Application project
  8. Put ShareMem as the first unit in your .dpr file
  9. Import Type Library unit: create the unit from the dll you've just created in step 6, and check "Generate Component Wrapper"
  10. In your FormCreate add the following code:

code:

var
  lTest: TTestObject;
begin
  lTest := TTestObject.Create(nil);
  try
    lTest.ConnectKind := ckNewInstance;
    lTest.Connect;
    lTest.Disconnect;
  finally
    lTest.Free;
  end;
end;

Now compile, run and close this application. A memoryleak will be reported.

Question:

Is this a bug in the Delphi code template, am I doing someting wrong, or is it intended to free FConnectionPoints yourself (the help doesn't mention it)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白龙吟 2024-08-24 04:55:11

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

有关接口的更多信息,请参阅这篇文章

Delphi 语言指南中的这一章也可能有所帮助。

I don't fully understand the question as I never worked with automation objects but as far as I can see IConnectionPoint is an interface. Interfaces in Delphi are reference-counted (if the implementation inherits from TInterfacedObject, TContainedObject or TAgreggatedObject or implements _AddRef and _Release accordingly), so there should be no memory leak.

For more information on interfaces look at this article.

This chapter from the Delphi Language Guide could help too.

暖伴 2024-08-24 04:55:11

我发现 Quality Central 报告中报告了此问题#1480.

管理员要求我创建一份新报告,所以我这样做了: 报告#81288

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

I found this issue to be reported in Quality Central report #1480.

A Sysop asked me to create a new report so I did: report #81288.

This also answers my question: it is a bug in the code template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文