Frequently Asked Questions

このセクションは、もしあなたが壊れたビルドを直したり、即答できる明らかな疑問を持っていたり、あるいは リファレンスマニュアル を読む時間がない場合に役に立つでしょう。この 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 リソース

書籍

人々

  • Don Box 長い間 COM プログラミングについて書いてきた頭のいい人です。

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: kohei.yoshino
 最終更新者: kohei.yoshino,