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<>
项是输出引用。只有传入的引用才能使某些东西保持活力。
你正在创建一个委托列表,当这个列表存在时,它将保存每个委托引用的每个对象的引用。
如果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