首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否有一种方法可以通过编程来判断特定的内存块是否未被FastMM释放?

是否有一种方法可以通过编程来判断特定的内存块是否未被FastMM释放?
EN

Stack Overflow用户
提问于 2012-01-09 15:26:35
回答 1查看 2.7K关注 0票数 103

我正在尝试检测是否有一个内存块没有被释放。当然,管理器通过对话框或日志文件告诉我,但如果我想将结果存储在数据库中怎么办?例如,我希望在数据库表中有一个分配给定块的例程的名称。

在阅读了FastMM的文档后,我知道从4.98版本开始,当内存分配、释放和重新分配发生时,管理器可能会通知我们。例如,OnDebugFreeMemFinish事件正在向我们传递一个包含有用信息的PFullDebugBlockHeaderPFullDebugBlockHeader缺少一样东西--应用程序是否释放了给定块的信息。

除非仅为未释放的块调用 OnDebugFreeMemFinish ,否则是否执行?这是我不知道的,我想找出答案。

问题是,即使连接到OnDebugFreeMemFinish事件,我也无法确定块是否被释放。

下面是一个示例:

program MemLeakTest;

{$APPTYPE CONSOLE}

uses
  FastMM4, ExceptionLog, SysUtils;


procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;

procedure Leak;
var
  MyObject: TObject;
begin
  MyObject := TObject.Create;
end;

begin
  OnDebugFreeMemFinish := MemFreeEvent;
  Leak;
end.

我缺少的是像这样的回调:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);

在浏览了FastMM的源代码后,我看到有一个过程:

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);

它可以被覆盖,但也许有一种更简单的方法?

EN

回答 1

Stack Overflow用户

发布于 2013-10-23 19:10:21

即使存在这样的处理程序,它也几乎是无用的,因为当FastMM报告泄漏时,包括DB在内的所有东西都会关闭。

因此,我建议您在FastMM4Options.inc中启用LogErrorsToFileFullDebugMode条件。这将为您提供一个有泄漏的文本文件,稍后您可以解析该文件并将其放入DB中。

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

https://stackoverflow.com/questions/8785109

复制
相关文章

相似问题

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