在单元从内存(终结部分)卸载之前不释放对象是否可以?
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?
是的,可能是。进程终止时系统会清理资源
但是,有几个附带条件:
- 大多数泄漏检测工具会检查所有动态分配的内存是否在您的进程 returns 控制系统之前被您的进程销毁。你打算做的事情使这些工具无能为力。
- 如果您的代码曾经内置到动态库(例如 DLL 或程序包)中,则可以卸载该库,而主机进程会继续存在。这是一个泄漏,会影响主机进程的生存能力。
- 有些对象需要最终确定,有时会有顺序限制。在不了解您的 class 的情况下,我们无法做出判断。
是的,没关系,但是:
1) 您可以使用以下结构:
ThreadPool := ThreadPool.Create;
RegisterExpectedMemoryLeak(ThreadPool);
这种方法避免了强制明确的单元引用顺序(这样这个单元就不会在使用它的单元之前取消初始化)。
2) 否则你可以 nil 变量(或者如果你想要 System.SysUtils 依赖使用 FreeAndNil):
finalization
ThreadPool.Free;
ThreadPool := nil;
这样你就可以很容易地找到发布时谁在访问线程池。
3) 您可以使用 TInterfacedObject 实现或包装源 class。
既然进程会被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?
是的,可能是。进程终止时系统会清理资源
但是,有几个附带条件:
- 大多数泄漏检测工具会检查所有动态分配的内存是否在您的进程 returns 控制系统之前被您的进程销毁。你打算做的事情使这些工具无能为力。
- 如果您的代码曾经内置到动态库(例如 DLL 或程序包)中,则可以卸载该库,而主机进程会继续存在。这是一个泄漏,会影响主机进程的生存能力。
- 有些对象需要最终确定,有时会有顺序限制。在不了解您的 class 的情况下,我们无法做出判断。
是的,没关系,但是:
1) 您可以使用以下结构:
ThreadPool := ThreadPool.Create;
RegisterExpectedMemoryLeak(ThreadPool);
这种方法避免了强制明确的单元引用顺序(这样这个单元就不会在使用它的单元之前取消初始化)。
2) 否则你可以 nil 变量(或者如果你想要 System.SysUtils 依赖使用 FreeAndNil):
finalization
ThreadPool.Free;
ThreadPool := nil;
这样你就可以很容易地找到发布时谁在访问线程池。
3) 您可以使用 TInterfacedObject 实现或包装源 class。