2012-04-11 24 views
0

私はCComPtr<IXmlReader>を参照渡しする必要がある状況があります。呼び出されたパラメータが呼び出し先パラメータから所有権を取得するか(または)参照カウントが増加するかCComPtr参照渡し

void foo(CComPtr<IXmlReader> & pReader) 
{ 
    // There is no reassignment of the CComPtr. 
    // Just call the IXmlReader methods. 
} 

CComPtr<IXmlReader> pReader; 
foo(pReader); 

// Is pReader still valid after the function return ? 

ありがとうございます。

答えて

1

再割り当てがない場合、なぜそれが参照パラメータですか?

に関係なく、参照カウントに変更はありません。はい、CComPtrは戻った後でも有効です。

+0

パフォーマンス上の理由から、彼はおそらくconst参照を渡すことを意味します。 – 01100110

+0

foo関数で参照カウント(ポインタの値を変更する)の必要がなく、参照カウントオーバーヘッドが心配な場合、パラメータを単純なポインタ(非CComPtrラップポインタ)にするだけです。 – dsharlet

0

参照カウントは呼び出し自体の影響を受けません。オブジェクトへの参照の数を追加または解放しているのは、ポインタによる内部関数操作のみです。

// pReaderは関数の復帰後も有効ですか?

はい、関数が値を再割り当てしない限り、NULLに設定するか、そこに新しい値を設定します。

引数が入力専用であっても、引数をこのように渡す際にプログラマーのボーナスがあります:(1)スマートポインタのドメイン内に完全に滞在しており、適切な参照カウントについて多くのことを心配する必要はありません(2)あなたはアサーションの失敗を例えば->初期化されていないポインタ(3)リリースビルドの最適化は、生のポインタを使用した場合とほぼ同じ速いコードを生成します。