Delphi XE中TWSDLLookup.Destroy方法存在内存泄漏问题

5
我正在使用Delphi XE。我在使用Delphi Soap时遇到了内存泄漏问题。这是由于TWSDLLookup.Destroy中缺少的.Free调用引起的,如QC 91160所述。
我的问题在于描述的解决方法,即只需在TWSDLLookup.Destroy方法中添加FLookup.Free即可。
我不想更改Delphi源码,因此我尝试将该单元复制到我的项目文件夹中,进行更改并重新编译,如Tom的回答(在此处)中所述。但是,这种技术的问题在于它似乎只有在您重新编译所有依赖单元时才能正常工作。我尝试仅复制WSDLLookup.pas到我的项目目录中,但会出现Stackoverflow错误。我不熟悉Web服务/SOAP,因此不知道如果使用此技术,我应该复制哪些其他单元。
同一页面上Rob Kennedy的回答描述了一种涉及代码挂钩的不同技术,但似乎不适用于对象方法。我已按照他建议的下载了TNT Unicode控件的免费代码并找到了相关过程,但我无法找到关于如何挂钩对象方法的信息 - 如果确实可能的话。如果我能做到这一点,那么我将钩住TWSDLLookup.Destroy并添加FLookup.Free调用。
任何修复此问题的想法都将不胜感激。我是一个新手程序员,因此希望我错过了一些明显的东西?
1个回答

3
您尝试的操作实际上是可以正常工作的。我亲自测试过了。这是我使用的项目文件:
program WSDLLookupTest;

{$APPTYPE CONSOLE}

uses
  WSDLLookup in 'WSDLLookup.pas';

var
  intf: IInterface;

begin
  intf := GetWSDLLookup as IInterface;
end.

我复制了 WSDLLookup.pas 文件,并将其放置在与 .dpr 文件相同的目录中。然后,我修改了副本中的 TWSDLLookup.Destroy,而不是原始文件中的该部分。
destructor TWSDLLookup.Destroy;
begin
  Beep;
  ClearWSDLLookup;
  FLookup.Free;
  inherited;
end;

我加入了Beep,以证明这段代码确实被执行。

如果我在您的位置上,我一定会使用这个解决方案,而不是尝试使用代码钩子。当然,另一个简单的解决方案就是升级到更高版本的Delphi。

需要注意的一点是,在升级时记得删除修改过的单元。这个泄漏问题在XE2中已经修复。


我看到有关使用调试dcus可能会导致问题的信息 - 可能这就是我遇到堆栈溢出的原因。或者我可能有另一个bug。 - David Orpen
无论如何,再次感谢。既然它确实起作用了,我会尝试找出我还做错了什么 :) - David Orpen
@DavidOrpen 不与 Debug DCUs 交互。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接