が、私はそのパス
class Base
{
//some implementation
};
class Deriv: public Base
{
//implementation
}
class Case1
{
boost::scoped_ptr<A> a_ //polymorphic data member owned by C
public:
Case1(A* a):a_(a)
{
}
};
class Case2
{
boost::scoped_ptr<A> a_ //polymorphic data member owned by C
public:
Case2(std::auto_ptr<A> a):a_(a.release())
{
}
};
のような多型クラス構造を持っていると私は、上記のもの多型のオブジェクトのいずれかを所有している第三級CASE1/2を持っているとしましょう。今は、このオブジェクトの所有権を取得するcase1/2クラスのコンストラクタにBase/Derivオブジェクトへのポインタを渡す必要があります。このオブジェクトをスマートポインタとして渡すべきですか?それを明確に私はあなたがスマートポインタを渡す必要があり、あなたはそれがスマートな名前を付ける必要があり、このオブジェクトの世話をターキン、または生のポインタ(ケース1)
Case1 c(new Deriv);
//compared to
Case2 c(std::auto_ptr<Base>(new Deriv));
間にある正確なゼロコードを意味しますか?なぜ私は一時的にすることもできないのです。 – Puppy
@DeadMG:どこに? 'Case1'コンストラクタが生ポインタの引数をスマートポインタに割り当てる前に例外をスローできるものを実行すると、そのオブジェクトはリークします。私は、この件に関するHerb SutterのGOTW記事へのリンクを追加しました。コンストラクタが引数を1つしか取らない場合でも問題はありませんが、Boostガイドラインを含む最も優れたコーディングスタイルでは、この理由ですべてのスマートポインタに名前を付けることを推奨します。 –
@James:彼が 'Case1 c(new Deriv);を呼び出すと、最初のDerivが構築され、Case1がそれを所有します。途中に投げる可能性のあるコードはありません。編集:その抜け穴はC++ 98について話しています。私が知る限り、このような欠陥を修正するために主に存在していたC++ 03にまだ存在することを実証するために別の記事を見つける必要があります。 – Puppy