由于该过程将被操作系统杀死并且所有分配的内存都将被回收,是否可以不在单元定型部分中释放对象/资源?
例如,
unit Threading;
interface
implementation
var threadpool: ThreadPool;
initialization
threadpool := ThreadPool.Create;
finalization
threadpool.Free; // is it OK to remove this?
end.
答案 0 :(得分:9)
由于该过程将被操作系统杀死并且所有分配的内存都将被回收,是否可以不在单元定型部分中释放对象/资源?
是的,可能是。系统将在进程终止时清理资源。
但是,有几个附带条件:
答案 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用于源类的实现或包装。