当我在我创建的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内存泄漏。
答案 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版本中得到修复