TWSDLLookup.Destroy方法中的Delphi XE内存泄漏

Dav*_*pen 5 delphi hook memory-leaks

我正在使用Delphi XE.我使用Delphi Soap遇到了内存泄漏问题.事实证明,由于QC 91160中TWSDLLookup.Destroy描述的失败

我遇到的问题是所描述的解决方法,它只是添加FLookup.FreeTWSDLLookup.Destroy方法中.
我不想改变Delphi源,所以我试图单位复制到我的项目文件夹,进行更改和重新编译,如所描述这里汤姆的回答.这种技术的问题在于它显然只有在你重新编译所有依赖单元时才有效.我试过只复制WSDLLookup.pas到我的项目目录,我得到一个Stackoverflow错误.我不熟悉Web Services/SOAP,所以如果我使用这种技术,我不知道应该复制哪些其他单元.

Rob Kennedy在同一页面上的回答描述了一种涉及代码挂钩的不同技术 - 但它似乎并不适用于对象方法.我已经完成了他的建议并下载了TNT Unicode控件的免费代码并找到了相关的程序,但我一直无法找到有关如何挂钩对象方法的信息 - 如果这确实可行的话.如果我能做到这一点,我会挂钩TWSDLLookup.Destroy并添加FLookup.Free通话.

如何解决这个问题的任何想法将非常感激.我是一个新手程序员,所以我希望我错过了一些明显的东西?

Dav*_*nan 3

您正在尝试做的事情实际上效果很好。我自己测试了一下。这是我使用的项目文件:

program WSDLLookupTest;

{$APPTYPE CONSOLE}

uses
  WSDLLookup in 'WSDLLookup.pas';

var
  intf: IInterface;

begin
  intf := GetWSDLLookup as IInterface;
end.
Run Code Online (Sandbox Code Playgroud)

我制作了该文件的副本WSDLLookup.pas并将其放置在与 .dpr 文件相同的目录中。然后,在副本而不是原始文件中,我修改了TWSDLLookup.Destroy.

destructor TWSDLLookup.Destroy;
begin
  Beep;
  ClearWSDLLookup;
  FLookup.Free;
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

我添加了 来Beep向自己证明这段代码确实正在执行。

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

需要注意的一件事是,升级时请记住删除修改过的单元。XE2 中修复了该泄漏。