简单HTTPRIO上的内存泄漏

时间:2013-07-31 16:31:33

标签: delphi memory delphi-xe2 memory-leaks

当我在我创建的THTTPRIO对象上退出应用程序时,我的内存泄漏。

我的网络服务定义如下:

type
  TSimpleWebService = class
  protected
    FHTTPRIO : THTTPRIO;
  public
    constructor Create(URL : String);
    property HTTPRIO : THTTPRIO read FHTTPRIO;
  end;

implementation

constructor TSimpleWebService.Create(URL : String);
begin
  FHTTPRIO := THTTPRIO.Create(nil);
  FHTTPRIO.URL := URL;
end;

我正在测试/创建Web服务(CustomerCare是我的webservice接口):

procedure TfrmMain.Button1Click(Sender: TObject);
var
  webservice: customercare;
begin
  webservice := GetSimpleCustomerCareService;
  webservice := nil;
  frmMain.Close;
end;

function TfrmMain.getSimpleCustomerCareService: CustomerCare;
var
  webservice: TSimpleWebService;
begin
  webservice := TSimpleWebService.Create('http://this.is.a.test');
  Result := webservice.HTTPRIO as CustomerCare;
end;

当我点击Button1时,我并没有做任何事情,只是创建了webservice,再次将其设置为nil并退出应用程序。此时(使用ReportMemoryLeaksOnShutDown:= True),在TSimpleWebService上出现意外的12字节内存泄漏。

我尝试过添加析构函数Destroy,但它似乎没有被调用。

我错过了什么?

感谢您的投入, 扬

哦,是的,我在XE2 Windows 2003上。除了TSimpleWebservice上的内存泄漏之外,我还在TDictionary对象上获得了内存泄漏,但我不知道那个来自哪里。当我在XE4 / Windows 7上编译并运行相同的项目时,我只得到TSimpleWebservice内存泄漏。

1 个答案:

答案 0 :(得分:4)

回答你的第二个问题:

  

哦,是的,我在XE2 Windows 2003上。除了TSimpleWebservice上的内存泄漏之外,我还在TDictionary对象上获得了内存泄漏,但我不知道那个来自哪里。当我在XE4 / Windows 7上编译并运行相同的项目时,我只得到TSimpleWebservice内存泄漏。

wsdllookup.pas中有一个memoryleak,将此文件复制到您的项目并找到这段代码

destructor TWSDLLookup.Destroy;
begin
  ClearWSDLLookup;
  inherited;
end;

将其更改为:

destructor TWSDLLookup.Destroy;
begin
  ClearWSDLLookup;
  Flookup.Free;   // this was missing!!!!
  inherited;
end;

正如您所发现的,此错误已在最近的Delphi版本中得到修复