メンバーポインタをスマートポインタ型クラスに格納して、それらを削除することを忘れない/忘れないようにしたい場合は、標準的な選択肢はですauto_ptr
。reset()
これはSTLにあり、割り当てられている現在のメモリを解放して新しいオブジェクトに置き換える必要がある場合に、関数で簡単に「リセット」できます。
auto_ptrメンバーを持つクラスには、独自のコピーコンストラクターと代入演算子を実装する必要があります。これは、auto_ptrs代入演算子が基になるオブジェクトの所有権を譲渡するため、デフォルトの代入演算子が希望する効果を発揮しないためです。
クラスは次のようになります。
class X
{
public:
X() :p(new ClassToManage) {}
X(const X ©)
: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を使用しない理由を自問してください)が、それらを使用して次のようなものを指す場合それは解放する責任があり、それからあなたはトラブルを求めています。コードを書くときの私の目標は、明示的な削除を行わないことです。