【问题标题】:Why are memory leaks reported for Indy 10?为什么 Indy 10 会报告内存泄漏?
【发布时间】:2014-06-27 02:44:44
【问题描述】:

我在 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 网站,但几乎没有任何意义。无论如何,看起来这个错误无法修复:最新版本的 Indy 无法用 Delphi 7 编译。唯一的解决方案可能是 Indy 9。 更新:看起来网站上所说的 v10.203 实际上是 v10.2.3。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    这是 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 =====================
    

    希望这会有所帮助。

    【讨论】:

    • 那是一年半前的supposedly fixed in the "latest Indy 10 snapshot"。使用随他们的 Delphi 版本一起提供的 Indy 版本的人正在使用过时的版本,应该升级。
    • 嗨,罗伯。我正在使用 IdAbout.ShowDlg;它表明我的 Indy 版本是 10.5.7。有比这个更新的版本吗?
    • 嗨,布赖恩。我的 Delphi 7 显示 IndyRegisterExpectedMemoryLeak 未编译(无蓝点),但初始化和终结部分确实有点。
    • @Altar 当前的 Indy 版本是 10.5.8(参见 IdVers.inc)
    • @mjn - 他们只有 v10.5.7 - svn.atozed.com:444/svn/Indy10/tags
    【解决方案2】:

    有一个 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/ 找到此版本以供下载

    【讨论】:

    • 请不要在您的帖子中使用签名、标语或其他此类信息。您发布的所有内容的右下角都有您的名字,并且您可以通过整个个人资料来告诉人们您是谁、您的爱好是什么,以及您希望他们了解的关于您的任何其他信息。谢谢。
    【解决方案3】:

    删除其他消息在主 DPR 中包含此命令

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

    添加 IdThread 使用。

    更多!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2018-11-11
      • 2011-10-25
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多