我不确定这样做是否可以,但这个问题与我在做一些研究时偶然发现的一个来源有关,我认为这是不正确的,我希望我可以在这里讨论这个问题。在http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/WPF-silverlight-pitfalls上,Chris Farrell 指出以下内容会导致内存泄漏:
...
Order newOrder = new Order(“EURUSD”, ...);
newOrder.OnPlaced += OrderPlaced;
m_PendingDeals.Add(newOrder);
...
void OrderPlaced(Order placedOrder)
{
m_PendingDeals.Remove(placedOrder);
}
声明如下:
当我们订阅 OnPlaced 事件时,OrderPlaced 事件处理程序仍然持有对 Order 对象的引用,并且该引用将保持 Order 对象处于活动状态,即使我们已将其从集合中删除。犯这个错误太容易了。
这个解释正确吗?
我会说不是:据我所知,是事件通知器保持对事件订阅者的函数指针的引用,因此也是事件订阅者,而不是相反。在这种情况下,是 Order 保留对处理类的引用,并且当该 Order 被删除时,它实际上会从内存中正确清除,假设没有对该 Order 的其他引用。想法?