2013-08-08 3 views
0

После прочтения this question, я попытался позволить конечному пользователю изменить стиль моего приложения во время выполнения. Это привело к самого длинный список утечек памяти с контентом, как это:Изменение стиля VCL во время выполнения приводит к утечке памяти

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; 
+1

'frx' указывает, что это FastReports, который не имеет ничего общего со стилями, и' DsgnIntf' означает, что это только код, который используется во время разработки в среде IDE. IOW, у вас здесь нет проблем. –

+0

@KenWhite Два момента: 1) Почему FastMM жалуется на утечку памяти, если frxDsgnIntf.pas не связан с моим приложением? 2) В конце отчета об утечке в приложении появляется индикация утечки памяти, которая возникает только при вызове 'TStyleManager.TrySetStyle (cbTheme.Text);'. Кажется, что когда 'TStyleManager' изменяет текущий стиль набора, активная форма не будет правильно выпущена/воссоздана. –

ответ