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

WeG*_*ars 4 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;
Run Code Online (Sandbox Code Playgroud)

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

为什么会出现这种泄漏


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

Bri*_*ost 5

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

  1. 在下面对文件IdGlobal.pas进行更改
  2. 将路径"C:\ Program Files\Embarcadero\RAD Studio\7.0\source\Indy\Indy10\System"(不带引号)添加到库中.

变化:

{$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 =====================
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.