【发布时间】:2013-08-31 22:38:21
【问题描述】:
我不确定这样做是否可以,但这个问题与我在做一些研究时偶然发现的一个来源有关,我认为这是不正确的,我希望我可以在这里讨论这个问题。在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);
}
声明如下:
OrderPlaced 事件处理程序仍然持有对 Order 的引用 从我们订阅 OnPlaced 事件开始的对象,并且 即使我们已删除,引用也会使 Order 对象保持活动状态 它来自收藏。很容易犯这个错误。
这个解释正确吗?
我会说它不是:据我所知,是事件通知器保持对事件订阅者的函数指针的引用,因此也是事件订阅者,而不是相反。在这种情况下,是 Order 保持对处理类的引用,并且当该 Order 被删除时,它实际上会从内存中正确清除,假设没有对该 Order 的其他引用。想法?
【问题讨论】:
-
这是一个问答网站,不是一个开放的讨论论坛。
-
@MikeW 这似乎不是一个基于讨论的问题,即使他说“讨论”,而是澄清事件如何保留对委托实例的引用,因为他找到了一篇回答该问题的文章以一种看起来不合逻辑的方式。
标签: c# events memory handler memory-leaks