为什么Indy 10会报告内存泄漏?

时间:2011-03-10 14:03:00

标签: delphi

我在Indy 10.5.7(Delphi 7下)中有这个漏洞。

5 - 12个字节:TIdThreadSafeInteger x 1
21 - 36字节:TIdCriticalSection x 2


我像这样使用Indy:

function getWeb(a,b:Integer):Integer;
var url: string;
    H: TIdHttp;
    SS: TStringStream;
begin
  url := 'http://blabla';
  H := TIdHttp.Create(nil);
  try
    SS := TStringStream.Create('');
    try
      H.Get(url, SS);
      Result := StrToInt(SS.DataString);
    FINALLY
     SS.Free;
    END;
  finally H.Free;
  end;

泄漏本身并不会打扰我,因为应用程序关闭。这使得我的甜瓜爆炸是我每次关闭应用程序时看到的错误消息。

为什么会出现这种泄漏?


我已经检查了Indy网站,但它几乎没有意义。无论如何,看起来这个bug无法修复:最新版本的Indy无法用Delphi 7编译。唯一的解决方案可能是Indy 9。 更新:看起来网站上的内容调用v10.203实际上是v10.2.3。

3 个答案:

答案 0 :(得分:5)

这是FastMM内存管理器出现的问题,并且已经存在了一段时间,并且有许多修复信息可用。我在Delphi 2010中使用的解决方案是:

  1. 将以下更改添加到文件IdGlobal.pas
  2. 将路径“C:\ Program Files \ Embarcadero \ RAD Studio \ 7.0 \ source \ Indy \ Indy10 \ System”(不含引号)添加到库中。
  3. 的变化:

    {$IFNDEF DOTNET}
      {$IFDEF REGISTER_EXPECTED_MEMORY_LEAK}
    function IndyRegisterExpectedMemoryLeak(AAddress: Pointer): Boolean;
    {$IFDEF USEINLINE}inline;{$ENDIF}
    begin
    
      // ===== My modification begins =====================
    
        Result := FastMM4.RegisterExpectedMemoryLeak(AAddress);
        Exit;
    
    
      // ===== My modification ends =====================
    

    希望这有帮助。

答案 1 :(得分:1)

有一个IdStack验证文件,它不通过清理功能。

打开文件IdStack.pas

在文件的末尾,请查找:

{$ IFNDEF DOTNET}  
   {$ IFDEF} REGISTER_EXPECTED_MEMORY_LEAK
      IndyRegisterExpectedMemoryLeak (GStackCriticalSection); 
   {$ ENDIF} 
{$ ENDIF} 

finalization 

    // Dont Free. If shutdown is from another Init section, it can cause GPF When stack 
    // Tries to access it. App will kill it off anyways, so just let it leak 

    // # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    // THIS LINE AND INCLUDE A COMMENT LINE DOWN 
    if GStackCriticalSection <> nil then FreeAndNil (GStackCriticalSection);
    // # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

    {$ IFDEF} FREE_ON_FINAL 
    // # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    // FreeAndNil (GStackCriticalSection); // DISABLE THIS LINE
    // # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    {$ ENDIF} 

    end. 

我正在使用Indy的10.515版,您可以在http://indy.fulgan.com/ZIP/

找到此版本供下载

答案 2 :(得分:0)

删除其他消息包括主DPR中的此命令

Application.terminate; 
if GThreadCount <> Nil then GThreadCount.Free; 

添加IdThread使用。

更多!