【问题标题】:RTL and VCL memory leakRTL 和 VCL 内存泄漏
【发布时间】:2013-03-18 11:05:09
【问题描述】:

我在 FullDebugMode 中使用 FastMM4 来查找内存泄漏,我收到很多关于 UnicodeStringTListTParameters 等实例的投诉,例如:

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

我目前的内存泄漏报告大约有两兆,而且它的大部分内容都是这样的。怎么了?我是否应该担心RTLVCL 内部以及它们内部可能存在的内存泄漏?如果是,我能对它们做些什么?

【问题讨论】:

  • @DavidHeffernan 我将尝试创建一个简约的应用程序。

标签: delphi delphi-xe2 fastmm


【解决方案1】:

我应该关注 RTL 和 VCL 内部以及它们内部可能存在的内存泄漏吗?

可能不会。 RTL/VCL 的最新版本是干净的。我没有遇到过他们的泄漏,尽管这并不是说你不会。

无论如何,您提供的报告看起来就像代码中的例行内存泄漏。当您的代码泄漏时,通常发生的情况是您创建了一个对象,然后未能销毁它。泄漏的对象可以拥有许多其他对象。它们都被 FastMM 跟踪并报告为明显的泄漏。所以,如果你创建了一个包含字符串的对象,那么泄露拥有的对象也会泄露字符串。

【讨论】:

  • 不幸的是,FastMM 无法遍历未释放的对象树并为您简化它,但如果您有 XE2 或 XE3,请尝试 AQTime,它将帮助您识别真实对象已经泄露了。
  • @WarrenP 上次我错误地允许 AQTime 进入我的机器时,IDE 每 5 分钟崩溃一次!
  • 当最后一次 XE3 更新发布时,AQTime 发生了一些奇怪的事情。它严重破坏了 AQTime,以至于 AQTime 变得毫无用处。我想知道这是否是一个偷偷摸摸的阴谋,以便巧妙地收回免费赠送的东西。我特此解除我对 AQTime 和 smartbear 的认可。真是一团糟。
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 2013-11-08
  • 2016-05-03
  • 2011-11-25
  • 2010-11-19
  • 2014-09-27
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多