delphi - 当链接到DLL时,Themes.pas 为什么会泄漏 TThemeServices singleton

  显示原文与译文双语对照的内容
0 0

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


我今天遇到了一个VCL内存泄漏,在 Themes.pas. 中只发生在dll中。 单元终止代码如下所示:


finalization
 if not IsLibrary then
 InternalServices.Free;

InternalServices 是在调用 ThemeServices 函数时按需创建的单例。 许多dll都没有用户界面,所以永远也不会创建这个 singleton 。 但是,我碰巧有一个com添加到Excel中,这会导致这个漏洞出现。

由于这个DLL从不重复加载和卸载同一进程,所以泄漏不会引起我的特别烦恼。 而且我知道如何使用 ThemeServicesClass 全局变量来修复漏洞。

不过我的问题是,问是否有人可以解释为什么这段代码是它的方式。 这似乎是故意编码的。 对于我的生活,我无法给出这种故意泄露的解释。

时间: 原作者:

0 0

一个解释是,在 OS加载程序锁定时执行单元终止节。 在此期间,在不冒死锁风险的情况下允许DLL执行哪些操作有很大的限制。

原作者:
0 0

我们同样遇到同样的问题。 以下是我们在项目中防止泄漏的操作:

  1. 在. dpr 文件中,将主题添加到使用部分。

  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.
    
    
0 0

在同样的想法上,必须有一个好理由离开( indy泄露了一些东西,或者至少是用来) 我更喜欢忽略它,比如:


{$I FastMM4Options.inc}
...
{$IFDEF EnableMemoryLeakReporting}
 if IsLibrary then//ThemeServices is leaked when created in a DLL.
 RegisterExpectedMemoryLeak(ThemeServices);
{$ENDIF}

原作者:
...