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

时间:2015-10-15 11:45:53

标签: delphi finalization

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

例如,

unit Threading;

interface

implementation

  var threadpool: ThreadPool;

initialization

  threadpool := ThreadPool.Create;

finalization

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

end.

3 个答案:

答案 0 :(得分:9)

  

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

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

但是,有几个附带条件:

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

是的,没关系,但是:

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

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

这种方法使您免于单位引用的强制显式顺序(因此该单元在使用它之前不会取消初始化)。

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

finalization
  ThreadPool.Free;
  ThreadPool := nil;

通过这种方式,您可以轻松找到在发布时访问ThreadPool的人员。

3)您可以将TInterfacedObject用于源类的实现或包装。