delphi - 有没有办法以编程方式判断特定内存块是否未被 FastMM 释放?

标签 delphi memory-leaks delphi-2009 fastmm

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

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

除非仅针对未释放的 block 调用OnDebugFreeMemFinish?这是我不知道并且想知道的。

问题是,即使 Hook 到 OnDebugFreeMemFinish 事件,我也无法确定该 block 是否已释放。

这是一个例子:

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);

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

最佳答案

即使存在这样的处理程序,它也几乎毫无用处,因为当 FastMM 报告泄漏时,包括数据库在内的所有内容都将被关闭。

因此,我建议您在 FastMM4Options.inc 中打开 LogErrorsToFile 以及 FullDebugMode 条件。这将为您提供一个带有泄漏的文本文件,稍后您可以解析该文件并将其放入数据库中。

关于delphi - 有没有办法以编程方式判断特定内存块是否未被 FastMM 释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8785109/

相关文章:

multithreading - 这段代码线程安全吗

Delphi 2007 打开项目时不恢复选项卡

mysql - Delphi XE10.x FireDAC - 查询期间错误失去与 MySQL 服务器的连接

c++ - Delphi 和 C/C++ DLL

c++ - 为什么我需要删除[]?

delphi - 如何确定接口(interface)的实现对象的类型

delphi - 在没有套接字的情况下,在 Delphi 中进行应用程序数据交换的最佳方法是什么?

c++ - 无法解决内存泄漏

c++ - 内存泄漏,找不到源头

delphi - Application.Restore 无法让我回到之前的位置,为什么?