首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在FastMM中隐藏预期的内存泄漏?

如何在FastMM中隐藏预期的内存泄漏?
EN

Stack Overflow用户
提问于 2015-02-23 17:22:43
回答 1查看 1.3K关注 0票数 7

下面的示例应用程序显示了问题所在:

代码语言:javascript
复制
program FalseMemLeak;

uses
  ShareMem;

var
  o: TObject;
begin
  o := TObject.Create; // "good" leak
  RegisterExpectedMemoryLeak(o);
  TInterfacedObject.Create; // bad leak
end.

我现在正在使用BorlndMM.dll替换,FastMMFullDebug.dll和我得到以下报告:

代码语言:javascript
复制
---------------------------
FalseMemLeak.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are:

5 - 12 bytes: TObject x 1
13 - 20 bytes: TInterfacedObject x 1

---------------------------
OK   
---------------------------

当我删除“坏”内存泄漏时,一切都很好,没有显示任何报告。但是,一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。

最初,我发现这是当我寻找这些独立内存泄漏,并发现他们注册,但仍然报告了那些真正的内存泄漏。

当我使用内置ReportMemoryLeaksOnShutdown := True时,它只报告TInterfacedObject的泄漏。

那么,在完全调试模式下使用FastMM时,是否有一种过滤已注册内存泄漏的方法?

为了说明这一点:这是随FastMM压缩而来的FastMM,它声明这是开箱即用的FastMM_FullDebugMode.dll的替代品,它使用FastMM4并加载FastMM_FullDebugMode.dll。因此,对内存管理器的所有调用都由FastMM4处理。但不知怎么的,它似乎忽略了过滤掉已注册的漏洞(这些漏洞是在替换的FastMM中注册的--在调试该BorlndMM.dll时可以看到)。是的,当使用FastMM4.pas时,注册的泄漏不会被报告,但是更改它是不值得争论的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 19:53:25

在FastMM4Options.inc中有以下内容:

代码语言:javascript
复制
{$ifdef borlndmmdll}
  ....
  {$undef HideExpectedLeaksRegisteredByPointer}
....

HideExpectedLeaksRegisteredByPointer的未定义是导致您所观察到的行为的原因。用定义的borlandmm.dll重新编译替换HideExpectedLeaksRegisteredByPointer,您的预期泄漏将从泄漏报告中被抑制。

但是,据推测,HideExpectedLeaksRegisteredByPointer的意图是未定义的。至于为什么会这样,我不太清楚,但我不能想象皮埃尔不知道这是怎么回事。无论如何,也许定义HideExpectedLeaksRegisteredByPointer是合理的。你也许愿意尝试一下。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28679557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档