Delphi 11.1 FMX 中关闭时 TGPUObjectsPool 内存泄漏

TGPUObjectsPool memory leak on shutdown in Delphi 11.1 FMX

运行 11.1,我在 Windows 64 位(发布模式)下关闭一个简单的基本 FMX 2D 应用程序时收到此 TGPUObjectsPool 错误。第一次看到这个错误。

只需 运行在 project.dpr 中使用 ReportMemoryLeaksOnShutdown := True 填写空白表格会导致关闭时出现此错误。

TForm 上没有组件。只需 运行 并关闭。这让我想知道,如果一个基本的空项目可以因此类内存泄漏而关闭,那么 Delphi 发布会进行什么样的 QA。

有什么办法可以消除这个错误?

---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

9 - 24 bytes: TGPUObjectsPool x 1    
89 - 104 bytes: TObjectDictionary<System.TClass,System.Generics.Collections.TObjectList<FMX.TextLayout.GPU.TReusableObject>> x 1

It makes me wonder what kind of QA is done for a Delphi release

实际上很多。数月的 Beta 测试、大量修复和内部构建。

这个问题实际上是在测试期间报告的,但只是在几周前,在最终版本修复时为时已晚。但是,在 11.1 发布后,已公开报告此泄漏(和其他泄漏):

RSP-37596 FMX TFontGlyphManager's UnInitialize not called in finalization

RSP-37600 Unexpected Memory Leak in TGPUObjectsPool

RSP-37613 Memory leak in an application that only serves forms

RSP-37656 Memory leak in FMX (simple project)

还有其他类似的内存泄漏(在 TFontGlyphManagerTBehaviorServices 等),因此希望这会在下一次更新中得到修复。

I guess maybe they should consider having their samples include the ReportMemoryLeaksOnShutdown=True.

有趣,因为我也看到了类似的报告:

RSP-37598 Make RTL, FMX and VCL developers turn on memory leak checking by default

我修复了它(作为解决方法),包括 ShareMem 作为我项目源中使用的第一个单元。

试试这个:

uses
{$IFDEF VER350} // 11.x
  FMX.FontGlyphs,  FMX.TextLayout.GPU,
{$ENDIF}

finalization
{$IFDEF VER350} // 11.x
  // RAD Studio 11 memory leak
  TFontGlyphManager.UnInitialize;
  TGPUObjectsPool.Uninitialize;
{$ENDIF}