12

我想知道如果我们想在关闭应用程序时销毁某些东西,为什么要使用“Finalization”?不关闭应用程序直接释放所有对象而不调用.Free?

谢谢。

4

2 回答 2

19

关闭应用程序不会直接释放所有对象而不调用Free吗?

不,Delphi 类实例不会被垃圾收集,因此需要手动销毁它们。

但是,如果您正在谈论一个可执行进程,那么不处置某些对象是完全可以接受的,因为当该进程终止时,操作系统将重新声明该进程拥有的所有资源。因此,即使 Delphi 析构函数不运行,操作系统也会在进程终止时整理所有内容。进程一旦终止就不可能泄漏任何系统资源。

请注意,如果该单元包含在 DLL 或包中,那么如果该 DLL 重复加载和卸载到单个进程中,那么在完成时未能销毁所有对象将导致内存泄漏。

如果您知道您的代码只在可执行文件中运行,那么在最终确定时不要随意使用Free对象。请注意,如果您使用的是内存泄漏检测工具,那么这样做会导致您故意泄漏的对象被视为内存泄漏。通过调用来处理RegisterExpectedMemoryLeak

最后要说明的一点是,对象的析构函数有时不仅仅是释放内存。例如,有时它可以将值保存到设置文件或注册表中。自然地,您不想省略为这样的对象运行析构函数。

于 2012-08-01T09:28:45.290 回答
5

添加到大卫赫弗曼回答的最后一点:可能需要正确释放其他资源,例如生成校验和的文件处理程序或连接到 PC 的某些硬件必须置于特定状态(例如激光关闭,这是我目前正在使用的)。

于 2012-08-02T07:33:35.857 回答