我在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。
答案 0 :(得分:5)
这是FastMM内存管理器出现的问题,并且已经存在了一段时间,并且有许多修复信息可用。我在Delphi 2010中使用的解决方案是:
的变化:
{$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使用。
更多!