このセクションは、もしあなたが壊れたビルドを直したり、即答できる明らかな疑問を持っていたり、あるいは リファレンスマニュアル を読む時間がない場合に役に立つでしょう。この FAQ は、通常は適切な答えへ直接的に参照するだけです。もしあなたが単に nsCOMPtr
について学ぶことを期待しているのであれば、スタートガイド にもっと良い紹介があります。
FAQ は、探しているものを早く見つけやすくするために複数のセクションに分かれています。 ほとんどの場合、答えは上記のリファレンスマニュアルを参照しているだけです。 同じことを 2 度説明する必要はありません :-)
ビルド時のエラー
ビルドが壊れました。エラーがあなた自身のコードでもなく、あなたのプラットフォームのコードでもなく、nsCOMPtr
の 中で起こっており、そしてあなたはそれを疑っています。あなたは正しい場所を見ています。
nsCOMPtr
と生の [XP]COM インタフェースポインタを比較しています
nsCOMPtr
を後に宣言しているクラスに対して宣言しています
XPCOM とリンクしていません
nsCOMPtr.h をインクルードしていません
NSCAP_FEATURE_DEBUG_PTR_TYPES
の設定が違います
実行時のエラー
NS_ASSERTION
"QueryInterface needed"
NS_PRECONDITION
"You can't dereference a NULL nsCOMPtr with operator->()"
NS_PRECONDITION
"You can't dereference a NULL nsCOMPtr with operator*()"
どうやって...
nsCOMPtr
を初期化するのですか?
nsCOMPtr
がスコープを抜ける前にそれを Release
するのですか?
それに 0
を代入してください。nsCOMPtr
が新しい値を取る時は、古い値があれば、いつもそれを Release
します。値 0
を割り当てるということは、NULL
の生のポインタを割り当てるのと同じようなことです。古い対象は、Release
されます。(より詳しくは、初期化と代入 を見てください。)
ただし、これには小さなパフォーマンス上のペナルティがあることに注意してください。nsCOMPtr
は、デストラクタの処理の中で、その時持つ値を Release
しようとします。最良の解決法は、nsCOMPtr
の生存期間をその参照を保持したい期間だけに調整することです。例えば、この例ではブロックを使っています。
// 最も効率的な枠組は、|nsCOMPtr| がちょうどその参照を // 保持する必要のある期間だけのスコープを設定することです。 nsresult SomeLongFunction( nsIBar* aBar ) { nsresult rv; // ... { // |nsIFoo| インタフェースは、短期間だけ必要です。 // そのため、その生存期間をブロック文の中で // 宣言して、制御します。 nsCOMPtr<nsIFoo> foo( do_QueryInterface(aBar, &rv) ); if ( foo ) foo->DoSomeFooThing(); // |foo| がスコープをはずれました。そのため、ここで |Release| が実行されます。 } // ...ここには |nsIFoo| を必要としない多くの事柄があります。 return rv; } |
編集者注: この議論を 効率性のセクションへ移動し、ここからリンクを張ります。
nsCOMPtr
のリークを作るのでしょうか (デバッグテストのため) ?
生の [XP]COM インタフェースポインタを「入出力」パラメタとして使う getter を呼べばよいのでしょうか?
nsIFoo*&
パラメタで設定する getter を呼べばよいのでしょうか?
その結果を AddRef
しない getter を呼べばよいのでしょうか?
インタフェースポインタを返すどの [XP]COM 関数 (getter) も、そのポインタに対して AddRef
をすでに呼び出していなければいけません。 もしそれが行われないのであれば、おそらくそれをバグとして報告すべきでしょう。 この問題を解決するのに使うどのコードパターンに対しても、このようにコメントすべきです。 例えば、// 警告: この getter は 結果を AddRef() していません。
もし getter が新しいポインタを関数の復帰値として返すのであれば、心配いりません。
一般
nsCOMPtr
は、コードを膨張させますか?
nsCOMPtr
は速いですか? タイトなループの中でも使えますか?
参考文献一覧
Web リソース
- nsCOMPtr.h と nsCOMPtr.cpp は、
nsCOMPtr
のソースです。LXR を使って、nsCOMPtr
のソースをオンラインで調べることができます。このコードを探検するのは、心臓が弱い人にとっても、冒険ではありません。 - COM の所有のガイドライン
- Interface Pointers Considered Harmful - Don Box 著 - "The C++ Report" 1995 年 9 月号初出記事
- COM Smart Pointers Even More Harmful - Don Box 著 - "The C++ Report" 1996 年 2 月号初出記事のフォローアップ
書籍
- Essential COM - Don Box 著
- Effective COM - Don Box 他著
- The C++ Programming Language (3rd Edition) - Bjarne Stroustrup 著
- Effective C++ (2nd Edition): 50 Specific Ways to Improve Your Programs and Designs - Scott Meyers 著
- More Effective C++ : 35 New Ways to Improve Your Programs and Designs - Scott Meyers 著
- Effective C++ CD: 85 Specific Ways to Improve Your Programs and Designs - Scott Meyers 著
人々
- Don Box 長い間 COM プログラミングについて書いてきた頭のいい人です。