我不確定是否可以這樣做,但這個問題與我在做一些研究時偶然發現的來源有關,而且我認爲這是不正確的,我希望我可以在這裏討論這個問題。在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保持引用事件訂閱者的函數指針,從而事件訂閱者,而不是其他方式。在這種情況下,訂單保持對處理類的引用,並且在刪除該訂單時,它將實際上從內存中正確清除,假定沒有其他對該訂單的引用。思考?
這是一個Q&A網站,而不是一個開放的論壇。 – 2013-08-31 22:44:27
@MikeW儘管他說「討論」,但這似乎並不是一個基於討論的問題,而是關於事件如何保留對委託實例的引用的澄清,因爲他發現了一篇以似乎不似乎的方式回答該問題的文章邏輯。 – Gjeltema