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

Is it ok not to free objects before unit unloads from memory (finalization section)?

既然进程会被OS杀死,而且所有分配的内存都会被回收,那么在unit finalization部分不释放objects/resources可以吗?

例如,

unit Threading;

interface

implementation

  var threadpool: ThreadPool;

initialization

  threadpool := ThreadPool.Create;

finalization

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

end.

如果从终结部分删除 Free 调用,则 threadpool 及其所有子对象将始终出现在应用程序的内存泄漏报告中。那时很难找到真正的内存泄漏。

某些对象可能会在销毁时执行日志记录操作或删除锁定文件。所以有必要执行所有的析构函数。

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

Since the process will be killed by OS and all memory allocated will be recycled anyway, is it OK not to free objects/resources in the unit finalization section?

是的,可能是。进程终止时系统会清理资源

但是,有几个附带条件:

  1. 大多数泄漏检测工具会检查所有动态分配的内存是否在您的进程 returns 控制系统之前被您的进程销毁。你打算做的事情使这些工具无能为力。
  2. 如果您的代码曾经内置到动态库(例如 DLL 或程序包)中,则可以卸载该库,而主机进程会继续存在。这是一个泄漏,会影响主机进程的生存能力。
  3. 有些对象需要最终确定,有时会有顺序限制。在不了解您的 class 的情况下,我们无法做出判断。

是的,没关系,但是:

1) 您可以使用以下结构:

ThreadPool := ThreadPool.Create;
RegisterExpectedMemoryLeak(ThreadPool);

这种方法避免了强制明确的单元引用顺序(这样这个单元就不会在使用它的单元之前取消初始化)。

2) 否则你可以 nil 变量(或者如果你想要 System.SysUtils 依赖使用 FreeAndNil):

finalization
  ThreadPool.Free;
  ThreadPool := nil;

这样你就可以很容易地找到发布时谁在访问线程池。

3) 您可以使用 TInterfacedObject 实现或包装源 class。