我有一个带有事件支持的自动化对象,它会泄漏内存。生成源附带的 FConnectionPoints 永远不会被释放。当我在析构函数中手动添加 FConnectionPoints.Free 时,泄漏就消失了。
我在 Delphi 7 上,使用 FastMM BorlandMM.dll 和 FastMM_Fulldebugmode.dll。
重现步骤:
- 启动一个新的 ActiveX 库项目
- 添加一个新的自动化对象:Name = TestObject; 检查“生成事件支持代码”
- 打开TypeLibrary,给ITestObject添加一个方法,给ITestObjectEvents添加一个事件
- 刷新,将生成代码。
- 将 ShareMem 添加为 .dpr 文件中的第一个单元
- 保存、编译和注册这个 ActiveX Server(运行菜单)
- 启动一个新的应用程序项目
- 将 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(帮助没有提及)?