我有这个功能
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,但没有发现内存泄漏
这是我在任务管理器中看到的一个例子,从begin
到end
内存增加了200字节,它永远不会被释放......
doHTTPRequest
begin = 3.480 KB
end = 3.652 KB
----------------
diff. 184 Byte
doHTTPRequest
返回值是html字符串(大约20 KB)
doHTTPRequest
由TIdHttpServer
调用,如下所示:
procedure TServer.CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
AResponseInfo.ContentText := doHTTPRequest('http://example.com/foo.html');
end
答案 0 :(得分:3)
首先,如果您要在之后立即释放Disconnect()
对象,则无需致电InputBuffer.Clear()
或TIdHTTP
。如果仍然连接,析构函数将关闭并释放套接字。
其次,TIdHTTP.Get()
在下载内容时会在内部分配内存,但它也释放了它分配的任何内存。在您的示例中,Get()
返回了下载内容的最终String
表示。你必须记住,Delphi的内存管理器(默认情况下为FastMM)不会将释放的内存返回给操作系统,内存将被缓存以供以后重用。这就是任务管理器向您展示的内容。任务管理器只知道您的进程从操作系统分配的内存,但它不知道您的进程实际上如何使用该内存。您无法使用任务管理器来诊断内存泄漏。您必须使用FastMM自己的泄漏跟踪功能,因为只有它知道哪些内存实际泄漏。您可以在System
单元中启用全局ReportMemoryLeaksOnShutdown
变量,但默认安装的FastMM启用了最少的泄漏报告。有关更详细的报告,请将完整版的FastMM安装到项目中并根据需要进行配置。