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

时间:2008-11-03 02:40:51

标签: delphi memory-management

我在关机时收到内存泄漏消息,说我正在泄漏某个对象的3个。但是有两个问题。

  1. 它只是间歇性地发生。我可以运行我的程序,完成相同的一系列步骤,(打开数据文件,显示它,然后再次关闭),有时消息会显示,有时则不会。在这些代码路径上没有调用random()或其他“非确定性”逻辑。

  2. 代码审查说报告的内存泄漏是不可能的;该对象仅在某个类中创建,并且在该类的析构函数中正确释放。 (我实例化了父类的三个以上的对象。在清理过程中没有异常。)

  3. 将跟踪输出添加到此类的构造函数和析构函数中,表明创建的每个对象都被销毁,即使内存管理器报告也是如此。所以我只能得出结论,这是误报。但是,将“RegisterUnexpectedMemoryLeak(self)”添加到构造函数会使消息消失。

    以前有人见过这样的事吗?知道可能导致它的原因吗?我尽可能肯定对象是而不是泄漏,所以发生了什么呢?

2 个答案:

答案 0 :(得分:7)

使用新鲜的FastMM,在链接器选项中启用地图文件构造,定义条件符号FullDebugMode并重建程序。然后完成你的步骤。在程序终止时,它应该生成文件programname__MemoryManager__EventLog.txt,其中包含有关程序在何处构建泄漏对象的信息。

答案 1 :(得分:0)

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