3

より良いコードを書くために、私はBoostのスマートポインターを使用することを約束しました。

boost::shared_ptr常にそのように初期化する必要がありますか?

boost::shared_ptr<TypeX> px(new TypeX);

私の混乱は、次のようなコードブロックから生じています。

void MyClass::FillVector()
{
    boost::shared_ptr<TypeX> tempX;
    if(//Condition a)
    {
        boost::shared_ptr<TypeX> intermediateX(new TypeA);
        tempX = intermediateX;
    }
    else
    {
        boost::shared_ptr<TypeX> intermediateX(new TypeB);
        tempX = intermediateX;
    }
    _typeXVec.push_back(tempX); // member std::vector< boost::shared_ptr<TypeX> >
}

_typeXVecにプッシュバックするスコープ内に保持しながら、その中間のshared_ptrをスキップする受け入れられた方法はありますか?

ありがとうございました。

編集:TypeAとTypeBはどちらもTypeXの子であることを明確にしたかった。

4

2 に答える 2

6
boost::shared_ptr<X> p;
if( condition ) {
  p.reset( new A() );
}else {
  p.reset( new B() );
}
于 2012-08-03T01:51:22.767 に答える
3

boost::shared_ptr は常にそのように初期化する必要がありますか?

はい。Boostのshared_ptrベスト プラクティスに従います。

これは、スマート ポインターが動的に割り当てられたオブジェクトの所有権を取得するための唯一の安全な方法ではありませんが、事実上どこでも使用できる一般的なパターンです。このパターンに精通している人なら誰でも、コードを見て、それが正しいことを簡単に知ることができます。

(したがって、たとえば、それtempX.reset(new TypeA);も安全であると確信していますが、100% 確信があるわけではありません。ドキュメントを確認する必要があり、おそらく実装を確認したいと思います。その後、可能性のあるすべての失敗ケースを熟考し、それらがすべて正しく処理されていることを確認する必要があります.パターンに従えば、あなたと後でコードを保守する人は、これらの問題について考える時間を無駄にする必要はありません.)

ただし、割り当てではなく、次のいずれかをお勧めします。

using std::swap;
swap(tempX, intermediateX);

tempX = std::move(intermediateX);

これらにより、割り当てに必要な不要なアトミック参照カウントの更新が不要になります。

于 2012-08-02T23:56:17.783 に答える