1

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

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

4

3 に答える 3

4

メンバーポインタをスマートポインタ型クラスに格納して、それらを削除することを忘れない/忘れないようにしたい場合は、標準的な選択肢はですauto_ptrreset()これはSTLにあり、割り当てられている現在のメモリを解放して新しいオブジェクトに置き換える必要がある場合に、関数で簡単に「リセット」できます。

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は参照カウントを行いますが、標準のコンテナーに格納できるため、非常に便利です。

最終的には、削除を担当する割り当てられたメモリを指すものにプレーンポインタを使用しないようにする必要があります。プレーンなole配列などにアクセスしたり反復したりするためにプレーンなポインタを使用する場合は、それで問題ありません(ただし、std :: vectorを使用しない理由を自問してください)が、それらを使用して次のようなものを指す場合それは解放する責任があり、それからあなたはトラブルを求めています。コードを書くときの私の目標は、明示的な削除を行わないことです。

于 2010-10-13T21:07:21.107 に答える
1

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

于 2010-10-14T07:20:52.347 に答える
0

通常、deep_copy_ptr を使用します。現在、これを行う loki smart_ptr と axter スマート ポインターを知っています。通常のメンバー変数であるかのように、ポインター クラスを自動的にコピーできます (特別な代入演算子/コピー コンストラクターを定義する必要はありません)。

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

于 2010-10-13T23:51:08.320 に答える