2011-12-14 119 views
2

我有一個函數,它在仿函數列表:將列表<Func <double,double >>導致內存泄漏?

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

的事情是,Func<double, double>與來自不同對象的方法分配。我現在關心的是垃圾收集器總是持有指向這些方法的指針,並且始終爲這些對象保存內存,因爲GC不知道如何處置它們。

我對不對?請問RunFunc導致內存泄漏?如果是的話,我該怎麼做才能釋放List<Func<double, double>> functorList所擁有的內存?

+3

是'RunFunc'做什麼的不僅僅是執行各功能以外名單?除非它存儲對列表或任何函數的引用,否則'RunFunc'本身不會導致任何內存泄漏。 – Rawling

+0

@Rawling,它只是執行功能 – Graviton

回答

3

您正在創建代表列表,並且在該列表存在的情況下,它將保存對每個代表引用的每個對象的引用。

如果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 
3

不,這不會導致內存泄漏。

只要List<>變得無法到達,它將被收集。 Func<>項目是outgoinf參考。只有傳入的引用才能保持活動。

+2

爲什麼?你能解釋一下嗎?謝謝。 –

+0

如果'List >'被放在某個地方,它會導致內存泄漏。 –

+2

@felix通過存儲引用,一切都可能導致泄漏。這不是真的在這裏。 –

相關問題