質問

メンバー変数としてのポインターを含むクラスがある場合、プレーンポインターを使用したくない場合は、どのような種類のスマートポインターが必要ですか?共有する必要はありません(したがって、shared_ptrは必要ありません)。 SCOPED_PTRは、初期化リスト以外のオブジェクトを構築する必要があるため、機能しません。

それとも、何かがまだ失敗する可能性がある場合(例外など)、作成中にscoped_ptrを使用し、その後プレーンポインターに割り当てることは一般的な慣行ですか?

役に立ちましたか?

解決

スマートポインタータイプクラスにメンバーポインターを保存したいだけなので、削除することを忘れない/忘れない場合、標準の選択肢は次のとおりです。 auto_ptr. 。それはSTLにあり、で簡単に「リセット」されます reset() 機能に割り当てられた現在のメモリをリリースし、新しいオブジェクトに置き換える必要がある場合。

AUTO_PTRメンバーを持つクラスに、独自のコピーコンストラクターと割り当てオペレーターを実装する必要があります。これは、auto_ptrs割り当てオペレーターが基礎となるオブジェクトの所有権を転送するため、デフォルトの割り当てオペレーターが必要な効果を持たないためです。

クラスがどのように見えるかは次のとおりです。

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

他のすべてのケースについては、提案します boost::shared_ptr. 。 shared_ptrは参照カウントを行いますが、それらを標準コンテナに保存することができ、非常に便利です。

最終的には、削除する責任がある割り当てられたメモリを指すものに対して、プレーンポインターを使用することを取り除く必要があります。プレーンオールアレイなどにアクセスまたは繰り返すためにプレーンポインターを使用したい場合は、それは問題ありません(ただし、STD :: Vectorを使用していない理由を自問してください)が、それらを使用して何かを指すとき解放する責任があり、トラブルを求めています。コードを書くときの私の目標は、明示的な削除を持たないことです。

他のヒント

使用できます std::auto_ptr, 、TR1より前に利用可能であったため、コードはTR1-SMARTPOINTERSをサポートするコンパイラに依存しません。

通常、deep_copy_ptrを使用します。今、私はこれを行うloki smart_ptrとaxter smartポインターを知っています。これにより、ポインタークラスを通常のメンバー変数である場合に自動的にコピーすることができます(特別な割り当てオペレーター/コピーコンストラクターを定義する必要はありません)。

初期化リストで具体的に初期化する必要はないと思います(ただし、通常のポインターのように、有効な値がない場合は使用しないでください)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top