2013-08-31 22 views
1

我不確定是否可以這樣做,但這個問題與我在做一些研究時偶然發現的來源有關,而且我認爲這是不正確的,我希望我可以在這裏討論這個問題。在http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/WPF-silverlight-pitfalls,克里斯·法雷爾指出,以下將導致內存泄漏:懸掛事件處理程序和內存泄漏:哪種方式?

... 
Order newOrder = new Order(「EURUSD」, ...); 

newOrder.OnPlaced += OrderPlaced; 
m_PendingDeals.Add(newOrder); 
... 
void OrderPlaced(Order placedOrder) 
{ 
    m_PendingDeals.Remove(placedOrder); 
} 

被聲明如下:

的OrderPlaced事件處理仍持有從什麼時候訂單 對象的引用我們訂閱了OnPlaced事件,並且即使我們已經從集合中刪除了 ,引用也會使Order對象保持活動狀態。犯這個錯誤很容易。

這個解釋是否正確?

我會說它不是:據我所知,事件notifyer保持引用事件訂閱者的函數指針,從而事件訂閱者,而不是其他方式。在這種情況下,訂單保持對處理類的引用,並且在刪除該訂單時,它將實際上從內存中正確清除,假定沒有其他對該訂單的引用。思考?

+0

這是一個Q&A網站,而不是一個開放的論壇。 – 2013-08-31 22:44:27

+0

@MikeW儘管他說「討論」,但這似乎並不是一個基於討論的問題,而是關於事件如何保留對委託實例的引用的澄清,因爲他發現了一篇以似乎不似乎的方式回答該問題的文章邏輯。 – Gjeltema

回答

1

你的解釋是正確的 - Order類的事件持有對OrderPlaced函數的引用。因此,包含OrderPlaced訂閱功能的實例在處置Order實例之前無法進行GC'd操作。

訂閱Order事件的對象的實例不知道引用,因此不是潛在內存泄漏的原因。

這是Jon Skeet在其中回答的一個類似問題。

Why and How to avoid Event Handler memory leaks?

+0

好極了!所以可以肯定的是,源代碼所提供的信息是完全不正確的,並且是相反的:)。對不起,我提到過討論,因爲沒有什麼可討論的。這更多的是關於「我想知道正確的解釋是什麼,它正在讀這個來源,讓我感到困惑」。 – user1610325

+0

@ user1610325是的 - 我讀了整篇文章,以確保沒有丟失任何東西,但它肯定會完全倒退,因此不正確。我不會說文章的其餘部分完全不正確,但我建議不要將其作爲參考。不知道爲什麼這個問題被擱置,因爲這是一個直接回答的問題,不受意見的影響,但我想這沒關係 - 你得到了你的答案。祝你好運! – Gjeltema