delphi XE6 TIdHTTP.Get(Indy 10)内存消耗

时间:2015-12-10 09:31:40

标签: delphi memory-leaks indy10 idhttp

我有这个功能

function doHTTPRequest(const AUrl: String): String;
// ------------------------------------------------------------------------
// return the response for a http request
var
   aIdHTTP : TIdHTTP;
begin
   Result  := '';

   aIdHTTP := TIdHTTP.Create(nil);
   try
     aIdHTTP.HandleRedirects := true;
     aIdHTTP.RedirectMaximum := 5;
     aIdHTTP.ConnectTimeout  := 5000;
     aIdHTTP.ReadTimeout     := 10000;

     Result := aIdHTTP.Get(aUrl);

     aIdHTTP.Disconnect(false); 

     if Assigned(aIdHTTP.IOHandler) then
        aIdHTTP.IOHandler.InputBuffer.Clear;

   finally
      if Assigned(aIdHTTP) then FreeAndNil(aIdHTTP);
   end;
end;

每当我调用此函数时,"任务管理器"增加私有工作集内存200字节(或多或少)。

我哪里错了?

我已经使用了FastMM和AQTime,但没有发现内存泄漏

这是我在任务管理器中看到的一个例子,从beginend内存增加了200字节,它永远不会被释放......

doHTTPRequest 
    begin = 3.480 KB
    end   = 3.652 KB
    ----------------
    diff.     184 Byte

doHTTPRequest返回值是html字符串(大约20 KB)

doHTTPRequestTIdHttpServer调用,如下所示:

procedure TServer.CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
   AResponseInfo.ContentText := doHTTPRequest('http://example.com/foo.html');
end

1 个答案:

答案 0 :(得分:3)

首先,如果您要在之后立即释放Disconnect()对象,则无需致电InputBuffer.Clear()TIdHTTP。如果仍然连接,析构函数将关闭并释放套接字。

其次,TIdHTTP.Get()在下载内容时会在内部分配内存,但它也释放了它分配的任何内存。在您的示例中,Get()返回了下载内容的最终String表示。你必须记住,Delphi的内存管理器(默认情况下为FastMM不会将释放的内存返回给操作系统,内存将被缓存以供以后重用。这就是任务管理器向您展示的内容。任务管理器只知道您的进程从操作系统分配的内存,但它不知道您的进程实际上如何使用该内存。您无法使用任务管理器来诊断内存泄漏。您必须使用FastMM自己的泄漏跟踪功能,因为只有它知道哪些内存实际泄漏。您可以在System单元中启用全局ReportMemoryLeaksOnShutdown变量,但默认安装的FastMM启用了最少的泄漏报告。有关更详细的报告,请将完整版的FastMM安装到项目中并根据需要进行配置。