【发布时间】:2013-12-11 19:31:24
【问题描述】:
当我有一个 TList(即“过程引用”列表)并且我清除它时,是否所有在匿名方法中使用的捕获变量都被释放,所以不会发生泄漏?
即。清除 TList 后引用计数是否生效?
【问题讨论】:
当我有一个 TList(即“过程引用”列表)并且我清除它时,是否所有在匿名方法中使用的捕获变量都被释放,所以不会发生泄漏?
即。清除 TList 后引用计数是否生效?
【问题讨论】:
委托类型像接口一样被引用计数(实际上它们是作为接口实现的)。这意味着如果它们超出范围,则幕后的对象(您可能已经看到某处提到的 ArcRec$xxxx 东西 - 那是编译器生成的类名)将被破坏。捕获的变量被实现为该类中的字段,因此它们也会超出范围并被释放。
但是您可能会注意一些循环引用,由于一些重要的事实,这可能会导致捕获变量的内存泄漏:
如果您在单个例程/方法中有多个匿名方法,它们都由单个类(即 ArcRec$xxxx 的东西)实现。因此,在这种情况下,具有最长生命周期的匿名方法可能会使另一个方法存活,即使它已经超出范围。
【讨论】: