为什么Themes.pas在链接到DLL时会泄漏TThemeServices单例

Dav*_*nan 8 delphi

更新: 在XE2中引入VCL样式的更改已消除了内存泄漏.所以我想这毕竟是无意的.


我今天在Themes.pas中遇到了VCL内存泄漏.它只发生在DLL上.单位终结代码如下:

finalization
  if not IsLibrary then
    InternalServices.Free;
Run Code Online (Sandbox Code Playgroud)

InternalServices是一个在调用ThemeServices函数时按需创建的单例.许多DLL没有UI,所以不要创建这个单例.但是,我碰巧有一个Excel加载项导致此泄漏显示.

泄漏并没有特别困扰我,因为这个DLL永远不会从同一个进程重复加载和卸载.而且我知道如何使用ThemeServicesClass全局变量修复泄漏.

但我的问题是,是否有人可以解释为什么这个代码是这样的.这似乎是故意用这种方式编码的.对于我的生活,我无法对这种故意泄漏做出解释.

Rob*_*edy 5

一种解释是在OS加载程序锁定处于活动状态时执行单元定型部分.在此期间,对允许DLL执行的操作存在重大限制,而不会有死锁的风险.


小智 5

我们也遇到了同样的问题.以下是我们目前为防止项目泄漏所做的工作:

  1. 在dll .dpr文件中,将Themes添加到uses部分.

  2. 关闭时添加以下内容以清除泄漏:

    procedure DLLEntryProc(EntryCode: integer);
    begin
      case EntryCode of
      DLL_PROCESS_DETACH:
      begin
        ThemeServices.Free;
      end;
      DLL_PROCESS_ATTACH:
      begin
      end;
      DLL_THREAD_ATTACH:
      begin
      end;
      DLL_THREAD_DETACH:
      begin
      end;
      end;
    end;
    
    begin
      {$IFDEF DEBUG}
      ReportMemoryLeaksOnShutdown  := True;
      {$ENDIF}
      DllProc := @DLLEntryProc;
    end.
    
    Run Code Online (Sandbox Code Playgroud)