delphi - 在Delphi中,将所有者设置为Application而不是nil有什么好处?

标签 delphi memory pascal

“应用程序”是 VCL 的一部分,因此不是线程安全的(可能是维护它所拥有的组件的非线程安全列表)。

我正在处理的项目有几个实例,其中应用程序被设置为所有者,而 Self 不是一个选项(类方法)。 我想传递“nil”,因为该变量在此函数结束时被释放。

假设有人忘记释放应用程序拥有的变量:

当应用程序关闭时,内存将被释放。 但我还了解到 Windows 会跟踪分配给每个进程的内存。因此,理论上,如果一个 nil 拥有的变量没有被释放,Windows 将在应用程序/进程终止时释放它。

那么,将所有者设置为 Application 而不是 Nil 有什么好处呢?

以下问题讨论了释放零拥有的变量的责任,但到此为止:

What is the meaning of nil owner in component constructor

最佳答案

虽然系统确实会在进程终止时释放内存,但执行期间的泄漏是一个潜在的问题。如果程序执行重复操作,并且每次都会泄漏内存,那么这些泄漏会随着时间的推移而累积,最终导致内存不足的情况。

对于应用程序单例对象拥有的组件,可以看到相同的行为。如果它们没有被显式销毁,那么它们只有在应用程序终止时才会被销毁。同样,随着流程的执行,这些泄漏可能会随着时间的推移而累积。

检测泄漏的正常方法是在执行期间跟踪所有分配,然后作为进程终止的最后一步,检查所有分配是否都有匹配的释放。此功能由多种工具提供,但在 Delphi 环境中,FastMM 内存管理器是提供此功能的最常用工具。

如果您创建一个由应用程序对象拥有的组件,并且没有显式销毁它,那么当泄漏检查器执行时,它不会显示为已泄漏。这是不可取的,因为存在未检测到的真正泄漏。

这个论点得出的结论是,在您描述的场景中最好有无主组件。

另一方面,有时您创建的组件希望与应用程序对象一样长,并且可能很难在代码中找到一个合适的位置来显式销毁它们。在这种情况下,由应用程序对象拥有是一个好方法。这正是所有者机制的设计目的。

我的经验法则:

  1. 如果组件是由流系统创建的(即表单),它将使用所有权机制来确保正确的生命周期管理。您无需在代码中执行任何操作。
  2. 如果您在代码中显式创建组件,那么最好遵循正常的创建模式,并在代码中显式销毁它。在这种情况下,请使该组件成为无主组件。
  3. 如果您不容易找到销毁组件的好地方,并且可以将其生命周期与另一个组件(即应用程序)联系起来,请将该组件作为所有者传递。

回到你问的问题。您询问为什么使用应用程序对象作为所有者是有利的。如上所述,在许多情况下,让这些组件不被拥有实际上是有利的。但有时将应用程序对象作为所有者也是有利的。

总之,没有任何硬性规则可供遵循。您需要了解所有权的含义,然后为每个组件选择适当的所有者,这可能因情况而异。

关于delphi - 在Delphi中,将所有者设置为Application而不是nil有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61024916/

相关文章:

ios - NSURLConnection 在下载大部分数据时导致内存警告

inno-setup - 如何在inno setup中刷新页面

set - Pascal中使用的集合的实现是什么?

Delphi:如何拥有非连续子范围枚举类型?

delphi - 即使不在 Delphi IDE 中逐步调试,也可以访问监视项

delphi - 重新对接后,关闭按钮出现在我的对接控件上

delphi - delphi自动滚动备忘录

linux - 如何记录进程/文件的所有内存访问?

c# - dotMemory快照导致wpf崩溃

android - Delphi、Android、SSL - IdSMTP ConnectTimeout - 在预设超时后不会终止与服务器的连接