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);
}

次のことが述べられています。

OrderPlaced イベント ハンドラーは、OnPlaced イベントをサブスクライブしたときからの Order オブジェクトへの参照をまだ保持しており、コレクションから削除しても、その参照によって Order オブジェクトは存続します。この間違いを犯すのはとても簡単です。

この説明は正しいですか?

そうではないと思います: 私が見る限り、イベント サブスクライバーの関数ポインターへの参照、つまりイベント サブスクライバーへの参照を保持するのはイベント通知機能であり、その逆ではありません。この場合、処理クラスへの参照を保持しているのは Order であり、その Order が削除されると、その Order への参照が他にないと仮定して、実際にはメモリから正しくクリアされます。考え?

4

1 に答える 1

1

あなたの解釈は正しいです -OrderクラスのイベントはOrderPlaced関数への参照を保持しています。したがって、OrderPlacedサブスクライブされた関数を含むインスタンスは、インスタンスが破棄されるまで GC できませんOrder

イベントをサブスクライブしたオブジェクトのインスタンスはOrder参照を認識しないため、潜在的なメモリ リークの原因にはなりません。

これは、Jon Skeet が回答する同様の質問です。

イベント ハンドラーのメモリ リークを回避する理由と方法は?

于 2013-08-31T22:54:51.457 に答える