2012-02-08 6 views
1

Marshal.FinalReleaseComObjectを使用していますが、COMObjectイベントの登録を解除してもメモリリークが発生する可能性がありますか?Marshal.FinalReleaseComObjectを使用していますが、COMObjectイベントからの登録を解除してもメモリリークが発生する可能性がありますか?

私は、このクラスは、破壊イベントが、私は元帥を行うと呼ばれたとき、私は

call_.ActionA += new COMObject.AEventHandler(AEvent); 
call_.ActionB += new COMObject.BEventHandler(BEvent); 
call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent); 

に加入して、次のイベントハンドラがありますCOMObject

protected COMObject.Call call_ = null; 

である私のクラスでの新しいメンバーを定義しています。 FinalReleaseComObject

Marshal.FinalReleaseComObject(call_) 

イベントからの退会はありません

call_.ActionA -= new COMObject.AEventHandler(AEvent); 
call_.ActionB -= new COMObject.BEventHandler(BEvent); 
call_.Destructed -= new COMObject.DestructedEventHandler(CallDestructedEvent); 

これはメモリリークを引き起こす可能性がありますか? GCがそれを処理するかどうか 回答をMSDNまたは記事にリンクできますか?

ありがとうございます! Dor。

+0

メモリリークの原因を無作為に推測することは、まれにしか行いません。リークの原因を見つけるのに役立つツールがいくつかあります(無料、有料)。あなたはそれらを見つけて使うほうがいいでしょう。 –

+0

1つでお勧めできますか?それはCOMと.NETを扱うことができますか? –

+1

私は「Windows用のデバッグツール」、特にADPlusを使ってメモリダンプをキャプチャすることから始めます(うまくいけば、OutOfMemoryExceptionが発生したとき、または長期間使用した直後のいずれか)。 WinDBGを使用して、そのメモリダンプを探索することができます。 SOSと呼ばれる拡張機能をロードすることができます。これにより、.NETの観点から同じダンプを調べることができます。私は行って、あなたがそれらを使用しようとする前にそれらを読んで(彼らはかすかな心のためではない) –

答えて

1

メモリリークに役立つかどうかを確認するためにリリースを行う前に、それらをアンサブスクライブしようとしましたか? 破壊されたハンドラがあります。そこで実行できます。

COMオブジェクトのプロパティを呼び出したことがありますか?have you released them properly too? 親オブジェクトでFinalReleaseComObjectを呼び出しても、子オブジェクトを解放していなくても親への言及はありませんが、依然としてぶら下がっている子供たちへの言及があるかもしれません。

+0

あなたの答えをサポートするためのリンクを提供できますか? –

+0

私の元の回答に含まれていたリンクは別として、http://mvdeveloper.blogspot.com/2012/02/marshalfinalreleasecomobject-fun.htmlがありますが、どちらもメモリリークに特化していません。この同じコードを繰り返し実行していて、COMオブジェクトが単一インスタンスでない場合は、COMオブジェクトの複数のコピーをメモリに格納します。 – Nanhydrin

+0

また、イベントハンドラ内で、COMオブジェクトのプロパティを使用している場合は、ハンドラでもそれらを解放する必要があります。 – Nanhydrin

関連する問題