5

Direct3D 10 アプリケーションを作成していて、COM オブジェクトがリークしていないことを確認したいと考えています。

はい、インターフェイスを CComPtr でラップしていますが、RAII とスマート ポインターがリークがないことを保証しているにもかかわらず、通常のヒープ割り当てリーク検出器を使用しているのと同じ理由で、とにかくリーク チェックが必要です。 Direct3D のような C ライブラリに) より低いレベルの抽象化にフォールバックし、生のポインター、新規、削除を使用する必要があり、間違いを犯します。(言うまでもなく、Release() の一部の呼び出しは、プログラムの最後に 0 を返しません)

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

4

1 に答える 1

4

CComPtr を使用している場合、それが一般的に私がアドバイスする主なことですが、Visual Studio を使用している場合に役立つ可能性があるものを見つけました。

Sara Fords のブログには、とてもクールなヒントがあります。

VS での AddRef/Release の問題のデバッグ

多くの情報がログに記録される可能性がありますが、基本的な考え方は、Visual Studio で addref/release 呼び出しを追跡することであり、一致しない AddRef/Release のペアを探すことができます。

少し手間がかかるかもしれませんが、かなり狡猾なアイデアのようです。

編集 2: おはようございます。

DllGetClassObject を使用していない場合は、参照の問題にはなりません。ただし、入出力パラメーターとして IUknowns を使用する場合注意が必要です。これは AddRef の MSDN からの宣伝文です。

作成するインターフェイス ポインターの新しいコピーごとに、このメソッドを呼び出します。たとえば、メソッドからポインターのコピーを渡す場合は、そのポインターで AddRef を呼び出す必要があります。ポインターを in-out パラメーターとしてメソッドに渡す前に、そのポインターで AddRef を呼び出す必要もあります。このメソッドは、出力値をコピーする前に IUnknown::Release を呼び出します。

同様にリリースの場合:

インターフェイス ポインターを使用する必要がなくなったときに、このメソッドを呼び出します。in-out パラメーターを受け取るメソッドを作成している場合は、渡しているポインターで Release を呼び出してから、その上に out-value をコピーします。

于 2011-08-19T23:22:48.517 に答える