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

前端之家收集整理的这篇文章主要介绍了TWSDLLookup.Destroy方法中的Delphi XE内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Delphi XE.我使用Delphi Soap遇到了内存泄漏问题.原来是由于TWSDLLookup.Destroy中缺少.Free调用,如 QC 91160中所述

我遇到的问题是描述的解决方法,它只是将FLookup.Free添加到TWSDLLookup.Destroy方法.
我不想更改Delphi源代码,所以我尝试将单元复制到我的项目文件夹,进行更改和重新编译,如Tom的答案中的here所述.这种技术的问题在于它显然只有在你重新编译所有依赖单元时才有效.我曾尝试将WSDLLookup.pas复制到我的项目目录中,并收到Stackoverflow错误.我不熟悉Web Services / SOAP,所以如果我使用这种技术,我不知道应该复制哪些其他单元.

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

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

解决方法

你要做的事实上工作得很好.我自己测试了一下.这是我使用的项目文件
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中得到修复.

猜你在找的Delphi相关文章