Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi XE memory leak in TWSDLLookup.Destroy method

I am using Delphi XE. I have come across a memory leak problem using Delphi Soap. It turns out to be due to a missing .Free call in TWSDLLookup.Destroy, as described in QC 91160

The problem that I have is the described work-around, which is simply to add FLookup.Free to the TWSDLLookup.Destroy method.
I don't want to change the Delphi source, so I tried copying the unit to my project folder, making the change and recompiling, as described here in Tom's answer. The problem with this technique is that it apparently only works if you also recompile all the dependent units. I have tried copying just WSDLLookup.pas to my project directory and I get a Stackoverflow error. I'm not familiar with Web Services / SOAP so I don't know what other units I should copy over if I do use this technique.

Rob Kennedy's answer on the same page describes a different technique involving code hooking - but it doesn't seem to apply to object methods. I have done as he suggests and downloaded the free code for the TNT Unicode controls and located the relevant procedures, but I have been unable to find info on how to hook an object's methods - if indeed this is possible. If I could do this, I would then hook TWSDLLookup.Destroy and add the FLookup.Free call.

Any ideas for how to fix this will be much appreciated. I'm a bit of a newbie programmer so I'm hoping that I've missed something obvious?

like image 803
David Orpen Avatar asked Oct 23 '22 04:10

David Orpen


1 Answers

What you are trying to do does in fact work fine. I tested it out myself. Here's the project file I used:

program WSDLLookupTest;

{$APPTYPE CONSOLE}

uses
  WSDLLookup in 'WSDLLookup.pas';

var
  intf: IInterface;

begin
  intf := GetWSDLLookup as IInterface;
end.

I made a copy of the WSDLLookup.pas file and placed it in the same directory as the .dpr file. Then, in the copy rather than the original, I modified TWSDLLookup.Destroy.

destructor TWSDLLookup.Destroy;
begin
  Beep;
  ClearWSDLLookup;
  FLookup.Free;
  inherited;
end;

I added the Beep to prove to myself that this code was indeed being executed.

In your position I would definitely use this solution instead of attempting code hooks. And of course the other simple solution is to upgrade to a later Delphi version.

One thing to be careful of is to remember to remove the modified unit when you do upgrade. The leak was fixed in XE2.

like image 186
David Heffernan Avatar answered Oct 30 '22 18:10

David Heffernan