我在 FullDebugMode 中使用FastMM4来查找内存泄漏,我收到很多关于UnicodeString
,TList
,TParameters
的投诉,像这样的例子:
A memory block has been leaked. The size is: 276
This block was allocated by thread 0x2928, and the stack trace (return addresses) at the time was:
404CFE [System][@GetMem$qqri]
408C0F [System][@NewUnicodeString$qqri]
408E40 [System][@UStrFromPWCharLen$qqrr20System.UnicodeStringpbi]
408F17 [System][InternalUStrFromPCharLen$qqrr20System.UnicodeStringpcii]
5C006B [Vcl.Themes][Themes.TUxThemeStyle.GetElementDetails$qqr27Vcl.Themes.TThemedScrollBar]
774861EF [GetWindowLongW]
74B6588B [Unknown function at DrawThemeParentBackground]
74B6586C [Unknown function at DrawThemeParentBackground]
74B6780B [Unknown function at OpenThemeData]
7748C5FE [Unknown function at gapfnScSendMessage]
77481B31 [Unknown function at PeekMessageA]
The block is currently used for an object of class: UnicodeString
A memory block has been leaked. The size is: 20
This block was allocated by thread 0x2928, and the stack trace (return addresses) at the time was:
404CFE [System][@GetMem$qqri]
406EB3 [System][TObject.NewInstance$qqrv]
407556 [System][@ClassCreate$qqrpvzc]
406EE8 [System][TObject.$bctr$qqrv]
814DD8 [Datasnap.DBClient][Dbclient.TCustomClientDataSet.ClearActiveAggs$qqrv]
815359 [Datasnap.DBClient][Dbclient.TCustomClientDataSet.ResetAllAggs$qqro]
80D8AC [Datasnap.DBClient][Dbclient.TCustomClientDataSet.InternalOpen$qqrv]
6948D7 [Data.DB][Db.TDataSet.DoInternalOpen$qqrv]
69498F [Data.DB][Db.TDataSet.OpenCursor$qqro]
80CA87 [Datasnap.DBClient][Dbclient.TCustomClientDataSet.OpenCursor$qqro]
69484B [Data.DB][Db.TDataSet.SetActive$qqro]
The block is currently used for an object of class: TBits
我当前的内存泄漏报告大约是2兆字节,其大部分内容都是这样的。怎么了?我是否应该关注RTL
和VCL
内部以及可能的内存泄漏?如果是的话,我该怎么办呢?
答案 0 :(得分:6)
我是否应该关注RTL和VCL内部以及其中可能存在的内存泄漏?
可能不是。最新版本的RTL / VCL很干净。我没有遇到过他们的泄密,虽然这并不是说你不会。
在任何情况下,您提供的报告看起来就像代码中的例行内存泄漏。当您的代码泄漏时,通常会发生的是您创建一个对象然后无法销毁它。泄漏的对象可以拥有许多其他对象。它们都被FastMM跟踪并报告为明显的泄漏。因此,如果您创建一个包含字符串的对象,那么泄漏拥有对象也会泄漏字符串。