TList<TProc>.Clear是否会释放所有已捕获的变量?

5
当我有一个TList(也就是“指向过程的引用”列表),并且我清空它时,所有在匿名方法中使用的捕获变量是否都会被释放,以避免内存泄漏?
也就是说,在清空TList时,是否会启用引用计数机制?
1个回答

5

委托类型与接口一样是引用计数的(实际上它们是作为接口来实现的)。这意味着,如果它们超出范围,幕后对象(您可能已经在某个地方看到过ArcRec $ xxxx的类名 - 这是编译器生成的类名)将被销毁。捕获的变量被实现为该类内部的字段,因此它们也会超出范围并被释放。

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

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


1
我曾经认为它会类似于对接口的引用,但至少接口给了我在类析构函数中放置一些代码的机会,以确保一切正常。这里有一种轻微的偏执症。;) 谢谢。 - Domus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接