【发布时间】:2013-08-08 08:05:40
【问题描述】:
在阅读this question 之后,我尝试让最终用户在运行时更改我的应用程序的样式。这导致了非常长长的内存泄漏列表,内容如下:
A memory block has been leaked. The size is: 12
This block was allocated by thread 0x130C, and the stack trace (return addresses) at
the time was: 404B3E [frxDsgnIntf.pas][System][@GetMem$qqri][1993] 454B77
[System.SysUtils][Sysutils.WideStrAlloc$qqrui] 454BB2 [System.SysUtils]
Sysutils.StrNew$qqrpxb] 53046E [Vcl.Controls][Controls.TWinControl.DestroyWnd$qqrv]
57E1C7 [Vcl.ComCtrls][Comctrls.TCustomTreeView.DestroyWnd$qqrv] A53DEE [JvComCtrls]
TJvTreeView.DestroyWnd$qqrv] 530733 [Vcl.Controls]
Controls.TWinControl.DestroyHandle$qqrv] 530703 [Vcl.Controls]
Controls.TWinControl.DestroyHandle$qqrv] 530703 [Vcl.Controls]
Controls.TWinControl.DestroyHandle$qqrv] 7552FEB6 [EnumThreadWindows] 530703
[Vcl.Controls][Controls.TWinControl.DestroyHandle$qqrv]
The block is currently used for an object of class: Unknown
几乎所有的泄漏都在frxDsgnIntf.pas,除了表单上允许用户更改样式的所有组件并且都指向这个过程:
with TdlgSettings.Create(nil) do // leak here according to FastMM report
try
if ShowModal = mrOk then;
finally
Release;
end;
有谁知道我做错了什么,或者这是TStyleManager 在更改样式时的预期行为?这是在运行时更改样式的代码:
procedure TdlgSettings.cbThemeChange(Sender: TObject);
begin
TStyleManager.TrySetStyle(cbTheme.Text); // cbTheme.Items lists all the themes which are included the application
end;
【问题讨论】:
-
frx表示它是 FastReports,与样式无关,DsgnIntf表示它只是在 IDE 中设计时使用的代码。 IOW,您这里没有问题。 -
@KenWhite 两点:1) 为什么如果 frxDsgnIntf.pas 没有链接到我的应用程序,FastMM 会抱怨内存泄漏? 2) 在泄漏报告的最后,有迹象表明我的应用程序内部存在内存泄漏,这仅在我调用
TStyleManager.TrySetStyle(cbTheme.Text);时发生。似乎当TStyleManager更改当前设置样式时,活动表单未正确释放/重新创建。
标签: delphi delphi-xe2 vcl-styles