更新: 在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全局变量修复泄漏.
但我的问题是,是否有人可以解释为什么这个代码是这样的.这似乎是故意用这种方式编码的.对于我的生活,我无法对这种故意泄漏做出解释.
小智 5
我们也遇到了同样的问题.以下是我们目前为防止项目泄漏所做的工作:
在dll .dpr文件中,将Themes添加到uses部分.
关闭时添加以下内容以清除泄漏:
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)| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |