为什么Delphi的内存管理器在关闭时报告错误的内存泄漏?

4
在关闭程序时,我收到了内存泄漏的消息,说我正在泄漏某个对象的3个。然而,有两个问题。
  1. 它只是偶尔发生。我可以运行我的程序,执行完全相同的步骤(打开数据文件,显示它,然后关闭),有时会显示该消息,有时则不会。在这些代码路径中没有对random()或其他“非确定性”逻辑的调用。
  2. 代码审查表明,报告的内存泄漏是不可能的;该对象仅在某个类中创建,并且在该类的析构函数中正确释放。(我实例化了比父类多得多的多个对象。清理期间没有引发任何异常。)

为此类的构造函数和析构函数添加跟踪输出显示每个创建的对象都被销毁,即使内存管理器报告相反。因此,我只能得出结论,这是一个错误的正面结果。但是,在构造函数中添加“RegisterUnexpectedMemoryLeak(self)”会使消息消失。

有人见过这样的情况吗?有什么想法可能会导致它?我几乎可以肯定对象不会泄漏,那么会发生什么呢?

2个回答

7
使用最新的FastMM,在链接选项中启用Map文件构建,定义条件符号FullDebugMode并重新构建程序。然后按照您的步骤进行操作。程序终止时,它应该生成名为programname__MemoryManager__EventLog.txt的文件,其中包含泄漏对象构造的程序位置信息。

0

创建一个你确定在同一个函数中的内存泄漏,然后观察内存管理器报告的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接