/.NET

2011-07-04 13 views
5

重複の可能性:Memory Leak in C#/.NET


Is it possible to have a memory leak in managed code? (specifically C# 3.0)
があり、この昨日の同様の質問でしたが、Javaのために、私興味があります - C#/ .NETでメモリリークを作成するには何が必要ですか?

+1

このスレッドの答えのいくつかは実際の例ではhttp: /smartbear.com/support/articles/aqtime/net-allocation-profiler/ "明らかに、このハンドラは特定のイベントから削除されず、結果としてリークが発生します。 –

答えて

12

静的イベント;彼らが範囲外になることは決してありません。

static event EventHandler Evil; 

for(int i = 0 ; i < 1000000 ; i++) 
    Evil += delegate {}; 

匿名メソッド

は単純で素敵なツー持ってここに彼ら が豚を使用して、変数/フィールドにコピーを取っていない限り解除とこと を購読することなので、いいです。

技術的それでもEvil.GetInvocationList()経由してアクセスすることができ、これは実際には、「漏れた」されていません - 通常のオブジェクトで使用する場合ただし、これは予想外のオブジェクトの寿命を引き起こす可能性があり、すなわち

MyHeavyObject obj = ... 
... 
SomeType.SomeStaticEvent += obj.SomeMethod; 

今オブジェクトobjに永遠に住んでいます。これは十分にの知覚漏れのIMOを満たし、 "私のアプリは恐ろしい死を遂げた"と私のために十分です; p

+0

しかし、あなたはまだそれを得ることができます...いいえ? –

+1

はい、私はこれを直前に修正しなければなりませんでした。これは再び起こらないためです。= –

+0

@Adam Ralph:イベントの登録が解除されていない限り、すべてのユーザは無期限に保存されます。イベントは静的です。 –

5

オブジェクトがイベントをサブスクライブすると、イベントを公開するオブジェクトはサブスクライバへの参照を保持します(実際には、イベントはMultiCastDelegateが最初に行いますが、それは実行されます)。この参照は、最後の参照(eventによって維持されているものを除く)が範囲外になる場合、サブスクライバがGCされないようにします。

他の2つの回答は、この状況が完全に後方にあり、正しくありません。これは簡単な例では少し難解ですが、大規模なプロジェクトでは一般的に見られますが、サブスクライバーへの参照はMultiCastDelegateevent)によって維持されているので、それを理解できるはずです。

編集:Marc氏の回答によれば、メソッドを使用して技術的に "リークされた"オブジェクトへの参照を得ることはできますが、あなたのコードはこれを使用する可能性は低く、OutOfMemoryExcetion

+0

非常に真実です。私は完全に同意します。しかし、これは質問に答えないことを覚えておいてください。 –

+0

@Adam Ralph:そうではありませんか?メモリリークの1つの方法について説明します。それはどのようにして質問に答えるのを避けるのですか? –

+0

私はあなたがメモリリークを説明していることに同意しません。メモリリークは、GCが壊れているのは、非ルーテッドオブジェクトによって使用されているすべてのメモリを解放していないためです。あなたが参照と寿命が正しく維持されていることを説明する状況では、GCはすべてのオブジェクトを生きた状態に保っています。 –

1

ダイレクトメモリアクセスは安全なマネージコードから抽象化されています。あなたが書いたコードやメモリリークバグのある第三者のリソース(おそらくFCL内)のいずれかで、メモリのリークを引き起こすためには、安全でないコードへの呼び出しが必要です。

関連する問題