[英]Will List<Func<double, double>> cause memory leak?
我有一个函数,它包含一个函子列表:
public void RunFunc(List<Func<double, double>> functorList)
事实是, Func<double, double>
分配有来自不同对象的方法。 现在,我担心的是,垃圾回收器将始终保留指向这些方法的指针,并始终保留这些对象的内存,因为GC不知道如何处置它们。
我对吗? RunFunc
会导致内存泄漏吗? 如果是,我应该怎么做以释放由List<Func<double, double>> functorList
?
不,这不会导致内存泄漏。
一旦List<>
不可访问,它将被收集。 Func<>
项目是outgoinf引用。 只有传入的引用才能使某些内容保持活动状态。
您正在创建一个委托列表,尽管存在该列表,它将保存对每个委托引用的每个对象的引用。
如果RunFunc
方法将此列表存储为成员,则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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.