List>导致内存泄漏

本文关键字:double 内存 泄漏 Func List | 更新日期: 2023-09-27 18:18:01

我有一个函数,它接受一个函子列表:

public void RunFunc(List<Func<double, double>> functorList)

问题是Func<double, double>被分配了来自不同对象的方法。我现在担心的是,垃圾收集器将始终保持这些方法的指针,并且始终保持这些对象的内存,因为GC不知道如何处置它们。

我说的对吗?RunFunc会导致内存泄漏吗?如果是,我应该做些什么来释放由List<Func<double, double>> functorList持有的内存?

List<Func<double, double>>导致内存泄漏

不,这不会导致内存泄漏。

一旦List<>变得不可达,它将被收集。Func<>项是输出引用。只有传入的引用才能使某些东西保持活力。

你正在创建一个委托列表,当这个列表存在时,它将保存每个委托引用的每个对象的引用。

如果RunFunc方法将这个列表存储为成员,那么只要列表被存储,对象就不会被垃圾收集。这是一件好事——否则以后它可能会尝试在一个已经销毁的对象上调用函数。

一旦列表停止被引用,它将不再阻止对象被垃圾收集。

所以,在回答你的问题时,RunFunc实际上与任何其他CLR方法没有任何不同,并且相同的垃圾收集规则将一如既往地应用。

下面是一个更简单的例子:

Action myAction = null;
{
   var widget = new Widget();
   myAction = () => { widget.ScooblyWob() }; 
}
// the widget object has gone out of scope, but will stay in memory
// It is not a candidate for garbage collection, because 
// it is being referenced by the myAction function.
myAction(); 
// Even though I have no explicit references to the widget, 
// I just called a function on it!
myAction = null;
// Now the action has been dereferenced, 
// so the widget is a garbage collection candidate