IdThreadSafe.pas 中 TIdCriticalSection.Create 的内存泄漏
Memory Leak of TIdCriticalSection.Create in IdThreadSafe.pas
在 Delphi 11 64 位应用程序中使用 TIdHttpServer 和 MadExcept,每次我关闭应用程序时,MadExcept 设置为报告“资源泄漏”,我得到两次泄漏,都与IdThreadSafe.pas 中的 TIdCriticalSection 和 SyncObjs.pas 中的 TCriticalSection。
这具有“虚假标志”泄漏的所有特征 - 即 MadExcept 报告的泄漏实际上并不存在。但我必须确定。
利用旧的“ReportMemoryLeaksOnShutdown := True”不会报告这 2 次泄漏...
还有其他人看到吗?
谢谢。
是的,它们是实际泄漏,是的,这是故意的行为。请参阅 Indy 的 IdThread.pas
和 IdStack.pas
单位底部的评论。
也就是说,它们是 已注册 泄漏,因此它们不应出现在泄漏报告中。在 Delphi 2006+。使用 System.RegisterExpectedMemoryLeak()
,因此如果 MadExcept 正确挂接到 RTL(即提供一个 TMemoryManagerEx.RegisterExpectedMemoryLeak
回调,忽略报告中报告的泄漏),它应该自动获取注册。
否则,对于早期版本,您可以使用 IdCompilerDefines.inc
中定义的 USE_MADEXCEPT
(或 USE_FASTMM4
,或 USE_LEAKCHECK
其他内存管理器)重新编译 Indy 以启用泄漏注册。
否则,您可以使用 IdCompilerDefines.inc
中定义的 FREE_ON_FINAL
重新编译 Indy 以堵住漏洞。
在 Delphi 11 64 位应用程序中使用 TIdHttpServer 和 MadExcept,每次我关闭应用程序时,MadExcept 设置为报告“资源泄漏”,我得到两次泄漏,都与IdThreadSafe.pas 中的 TIdCriticalSection 和 SyncObjs.pas 中的 TCriticalSection。
这具有“虚假标志”泄漏的所有特征 - 即 MadExcept 报告的泄漏实际上并不存在。但我必须确定。
利用旧的“ReportMemoryLeaksOnShutdown := True”不会报告这 2 次泄漏...
还有其他人看到吗?
谢谢。
是的,它们是实际泄漏,是的,这是故意的行为。请参阅 Indy 的 IdThread.pas
和 IdStack.pas
单位底部的评论。
也就是说,它们是 已注册 泄漏,因此它们不应出现在泄漏报告中。在 Delphi 2006+。使用 System.RegisterExpectedMemoryLeak()
,因此如果 MadExcept 正确挂接到 RTL(即提供一个 TMemoryManagerEx.RegisterExpectedMemoryLeak
回调,忽略报告中报告的泄漏),它应该自动获取注册。
否则,对于早期版本,您可以使用 IdCompilerDefines.inc
中定义的 USE_MADEXCEPT
(或 USE_FASTMM4
,或 USE_LEAKCHECK
其他内存管理器)重新编译 Indy 以启用泄漏注册。
否则,您可以使用 IdCompilerDefines.inc
中定义的 FREE_ON_FINAL
重新编译 Indy 以堵住漏洞。