【发布时间】:2015-04-20 16:40:26
【问题描述】:
Embarcadero 的 TTaskbar 存在内存泄漏。由于我在表单上删除了此控件,因此每次关闭应用程序时 FastMM 都会报告泄漏。
我尝试使用以下代码使 FastMM 静音:
procedure TMainForm.FormCreate(Sender: TObject);
begin
fastmm4.RegisterExpectedMemoryLeak(Taskbar);
end;
但它不会工作。如何注册此泄漏?
内存块已泄漏。大小为:100
这个块是由线程 0xC64 分配的,堆栈跟踪(返回 地址)当时是:406A52 409A7B 409CAC 4283A0
[System.SysUtils][System][System.SysUtils.FmtStr] 409CC6 40D775 7628A65F
[StretchDIBits 处的未知函数] 7731594E
[RtlpNtMakeTemporaryKey 处的未知函数] 7731594E
[RtlpNtMakeTemporaryKey 处的未知函数] 773168F8
[RtlpNtMakeTemporaryKey 处的未知函数] 773168DC
[RtlpNtMakeTemporaryKey 的未知函数]该块当前用于类对象:UnicodeString
分配号为:2209内存块已泄漏。尺寸为:36
这个块是由线程 0xC64 分配的,堆栈跟踪(返回 地址)当时是:406A52 407D43 40846A 42CD40
[System.SysUtils][System][System.SysUtils.Exception.CreateFmt] 5DEDD7
[System.Win.TaskbarCore][System.Win][System.Win.TaskbarCore.TTaskbarBase.UpdateTab] 610F00
[Vcl.Taskbar][Vcl][Vcl.Taskbar.CheckMDI] 5DF39F
[System.Win.TaskbarCore][System.Win][System.Win.TaskbarCore.TTaskbarBase.ApplyTabsChanges] 610DB8
[Vcl.Taskbar][Vcl][Vcl.Taskbar.TCustomTaskbar.Initialize] 5EB044
[Vcl.Forms][Vcl][Vcl.Forms.TApplication.Run] 62573A
[MinimalTemplate.dpr][MinimalTemplate][MinimalTemplate.MinimalTemplate][26]该块当前用于类对象:ETaskbarException
分配号为:2207此应用程序已泄漏内存。小块泄漏是(不包括指针注册的预期泄漏):
21 - 36 字节:ETaskbarException x 1
85 - 100 字节:UnicodeString x 1
[Vcl.Forms][Vcl][Vcl.Forms.TCustomForm.SetVisible] 5F5010
【问题讨论】:
-
这里无法重现。好的,现在我可以看到泄漏的位置。它位于
TTaskbarBase.UpdateTab。也太震撼了吧! -
我认为处理这个问题并不容易。解决问题可能是前进的方向。不过,如果没有复制品,我将无法再做任何事情。不过,您确实需要向 emba 提交错误报告。创建异常但未能引发异常?!!!
-
在此处复制项目:filedropper.com/repro_1
-
@Altar:在表单上删除
TTaskbar组件并调用Taskbar1.UpdateTab()足以重现此 -
@GünthertheBeautiful-在我的情况下,只需将组件放在表单上就足够了!