我在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
内部以及它们内部可能存在的内存泄漏?如果是的话,我该怎么办?
我应该关心RTL和VCL内部和可能的内存泄漏吗?
大概不会。最新版本的RTL/VCL是干净的。我没有遇到过泄漏,尽管这并不是说你不会遇到。
在任何情况下,您呈现的报告看起来就像代码中的例行内存泄漏。当您的代码泄漏时,通常会发生的情况是您创建了一个对象,然后没有销毁它。泄漏的对象可以拥有许多其他对象。它们都被FastMM跟踪,并被报道为不同的泄漏。因此,如果您创建了一个包含字符串的对象,那么泄漏所属对象也会泄漏字符串。