在单元从内存卸载之前是否可以释放对象(完成部分)?

jus*_*tyy 2 delphi finalization

由于该过程将被操作系统杀死,并且所有分配的内存都将被回收,是否可以在单元定型部分中释放对象/资源?

例如,

unit Threading;

interface

implementation

  var threadpool: ThreadPool;

initialization

  threadpool := ThreadPool.Create;

finalization

  threadpool.Free; // is it OK to remove this?

end.
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 9

由于该过程将被操作系统杀死,并且所有分配的内存都将被回收,是否可以在单元定型部分中释放对象/资源?

是的,可能是.系统将在进程终止时清理资源.

但是,有几个附带条件:

  1. 大多数泄漏检测工具会在将控制权返回给系统之前检查所有动态分配的内存是否被进程破坏.你提议做什么使这些工具无能为力.
  2. 如果您的代码被构建到动态库(如DLL或包)中,则可以卸载库,同时主机进程可以使用.这是泄漏,可能会影响主机进程的可行性.
  3. 某些对象需要进行最终化,有时会出现排序约束.如果不了解你的课程,我们无法判断.

  • 要添加,有些情况可能会有问题.例如,我们自己的软件在启动时动态加载字体,并且必须在关机时卸载该字体.如果它没有正确卸载字体,那么该字体文件会卡在内存中,直到系统重新启动.即使强行终止该过程也会导致卡住.然后,如果我们需要替换那个字体文件,我们就不能. (3认同)

Wos*_*osi 5

如果Free从最终化部分中删除该调用,则threadpool其所有子对象将始终存在于应用程序的内存泄漏报告中.那么很难找到真正的内存泄漏.

某些对象可能会在destroy上执行日志记录操作或删除锁定文件.因此,执行所有析构函数可能是必要的.

作为(Delphi)开发人员,您应该始终注意清理堆.否则,您可能会失去对内存管理的控制.它可能会花费你或你的公司很多钱来控制它.