2011-08-17 10 views
4

Direct3D 10アプリケーションを作成していて、COMオブジェクトが漏れていないことを確認したい。Ref-counted COMオブジェクト(リリースなしのAddref)でメモリリークを検出する

はい、CComPtrでインターフェイスをラッピングしていますが、RAIIとスマートポインタによってリークがないことが保証されているにもかかわらず、通常のヒープ割り当てリークディテクタを使用しているのと同じ理由でリークチェックが必要です(特にDirect3DのようなCライブラリに接続する場合)、抽象度の低いレベルにフォールバックし、生ポインタ、新規、削除を使用し、間違いを犯さなければなりません。 (Releaseの呼び出しの中には、プログラムの終わりに0を返さないものもあります)

atlbase.hをインクルードする前に#define _ATL_DEBUG_INTERFACESを定義しましたが、出力ウィンドウに何も表示されません! _ATL_DEBUG_INTERFACESを動作させるために何か必要なことはありますか?

+0

私はCOM関連の解決策はわかりませんが、Direct3Dではデバッグバージョンを使用できます。私が思い出す限り、これは出力ウィンドウのメモリリークについて教えてくれます。 – JPW

+0

デバッグモードで通常のヒープ割り当てメモリのメモリリークを報告していますが、リークした場合はリークしたCOMオブジェクトは報告されません。 – jeffythedragonslayer

+0

ここで同じことを話しているかどうかはわかりません。 http://msdn.microsoft.com/en-us/library/ee416791(v=vs.85)を参照してください。aspx Direct3D 9のデバッグバージョンに切り替えると(新しいバージョンではもっと複雑になるでしょう)、私は未処理のDirect3Dメモリについて多くの情報を得ています。 – JPW

答えて

3

あなたがCComPtrを使用しているのであれば、それは一般的には私が助言する主なものですが、Visual Studioを使用している場合は助けになるかもしれません。

サラフォードのブログは本当にクールなヒントがあります:あなたはログインして情報の多くを取得する可能性があります

Debugging AddRef/Release issues in VS

が、基本的な考え方は、あなたのAddRef /解放をトレースすることであるVisual Studioで呼び出し、あなたAddRef/Releaseの不一致のペアを探すことができます。

足踏みがあるかもしれませんが、かなり狡猾なアイデアのようです。

編集2:おはよう;

DllGetClassObjectを使用していない場合は、参照の問題にはなりません。 イン/アウトパラメータとしてIUknownsを使用にはには注意がありますが、これは、のAddRefのためのMSDNからの宣伝文句です:

コールあなたが作る インターフェイスポインタのすべての新しいコピーのためのこの方法。たとえば、 メソッドからポインタのコピーを戻す場合は、そのポインタでAddRefを呼び出す必要があります。ポインタを AddRefにコールしてから、in-outパラメータとして メソッドに渡す必要があります。このメソッドは、その上に out-valueをコピーする前にIUnknown :: Releaseを呼び出します。あなたは、もはやインターフェイスポインタを使用する必要が

コールこの方法:リリースの同様

。 イン・アウト・パラメーターを受け取るメソッドを作成する場合は、渡したポインターの Releaseを呼び出して、アウト・値 をその上にコピーしてください。

+0

は賢いようですが、すべてがうまくいくと静かなことを期待していましたが、プログラムが終了してもまだインターフェイスが残っていればデバッグ情報しか表示されません。しかし、それを試してみましょう。 – jeffythedragonslayer

+0

独自のCComPtrを実装するとどうなりますか、スマートタイプでラップされないAddRefを使用する方法があるのではないかと心配していますか? –

+0

私はプログラムでは明示的に表示されていないAddRefsが呼び出されていることに懸念しています。なぜなら、プログラムの先頭で一度だけ作成され、最後に破棄されるCOMオブジェクトを取ると(d3dデバイス)、Releaseの戻り値は5と同じですが、0にする必要があります。 – jeffythedragonslayer

関連する問題