【问题标题】:Does a TList<TProc>.Clear free all captured variables?TList<TProc>.Clear 是否释放所有捕获的变量?
【发布时间】:2013-12-11 19:31:24
【问题描述】:

当我有一个 TList(即“过程引用”列表)并且我清除它时,是否所有在匿名方法中使用的捕获变量都被释放,所以不会发生泄漏?

即。清除 TList 后引用计数是否生效?

【问题讨论】:

    标签: delphi anonymous-methods


    【解决方案1】:

    委托类型像接口一样被引用计数(实际上它们是作为接口实现的)。这意味着如果它们超出范围,则幕后的对象(您可能已经看到某处提到的 ArcRec$xxxx 东西 - 那是编译器生成的类名)将被破坏。捕获的变量被实现为该类中的字段,因此它们也会超出范围并被释放。

    但是您可能会注意一些循环引用,由于一些重要的事实,这可能会导致捕获变量的内存泄漏:

    如果您在单个例程/方法中有多个匿名方法,它们都由单个类(即 ArcRec$xxxx 的东西)实现。因此,在这种情况下,具有最长生命周期的匿名方法可能会使另一个方法存活,即使它已经超出范围。

    【讨论】:

    • 我已经收集到它类似于对接口的引用,但至少接口让我有机会在类析构函数中放入一些代码以确保。这里出现了一种轻微的偏执狂。;) 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多