1

我不确定这样做是否可以,但这个问题与我在做一些研究时偶然发现的一个来源有关,我认为这是不正确的,我希望我可以在这里讨论这个问题。在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 的其他引用。想法?

4

1 回答 1

1

您的解释是正确的 -Order类的事件包含对该OrderPlaced函数的引用。因此,包含OrderPlaced订阅的函数的实例在实例被释放之前不能被 GC'd Order

订阅Order事件的对象实例不知道引用,因此不是潜在内存泄漏的原因。

这是 Jon Skeet 回答的类似问题。

为什么以及如何避免事件处理程序内存泄漏?

于 2013-08-31T22:54:51.457 回答