Kho*_*khe 3 memory delphi pascal
“应用程序”是 VCL 的一部分,因此不是线程安全的(可能用于维护它拥有的非线程安全组件列表)。
我正在处理的项目有几个实例,其中 Application 设置为 Owner,而 Self 不是一个选项(类方法)。鉴于变量在此函数结束时被释放,我想改为传递“nil”。
假设有人忘记释放应用程序拥有的变量:
当应用程序关闭时,内存被释放。但我也读到 Windows 会跟踪分配给每个进程的内存。因此,理论上,如果未释放 nil 拥有的变量,Windows 将在应用程序/进程终止时释放它。
那么,将所有者设置为 Application 而不是 Nil 有什么好处?
以下问题讨论了释放 nil 拥有的 vars 的责任,但仅限于此:
虽然系统会在进程终止时释放内存,但执行期间的泄漏是一个潜在的问题。如果程序执行重复操作,并且每次都泄漏内存,那么这些泄漏会随着时间的推移而累积并最终导致内存不足的情况。
对于应用程序单例对象拥有的组件,可以看到相同的行为。如果它们没有被明确销毁,那么它们只有在应用程序终止时才会被销毁。同样,随着流程的执行,这些泄漏可能会随着时间的推移而累积。
检测泄漏的正常方法是在执行期间跟踪所有分配,然后作为进程终止的最后动作,检查所有分配是否都具有匹配的释放。此功能由各种工具提供,但在 Delphi 上下文中,FastMM 内存管理器是提供此功能的最常用工具。
如果您创建了一个由应用程序对象拥有的组件,并且没有显式销毁它,那么当您的泄漏检查程序执行时,它不会显示为已泄漏。这是不可取的,因为您有未检测到的真正泄漏。
这个论点得出的结论是,在您描述的场景中最好使用无主组件。
与此相反的一面是,有时您创建的组件希望与应用程序对象一样长,并且可能很难在代码中找到明确销毁它们的好地方。在这种情况下,由应用程序对象拥有是一个很好的方法。这正是所有者机制的设计目的。
我的经验法则在这里:
回到你问的问题。您询问了将应用程序对象用作所有者的好处的原因。如上所述,在许多情况下,让此类组件无主实际上是有利的。但有时,将应用程序对象作为所有者是有利的。
总之,没有单一的硬性规则可以遵循。您需要了解所有权的含义,然后为每个组件选择合适的所有者,这可能因情况而异。
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |