クラスメンバー変数の非共有スマートポインター
-
30-09-2019 - |
質問
メンバー変数としてのポインターを含むクラスがある場合、プレーンポインターを使用したくない場合は、どのような種類のスマートポインターが必要ですか?共有する必要はありません(したがって、shared_ptrは必要ありません)。 SCOPED_PTRは、初期化リスト以外のオブジェクトを構築する必要があるため、機能しません。
それとも、何かがまだ失敗する可能性がある場合(例外など)、作成中にscoped_ptrを使用し、その後プレーンポインターに割り当てることは一般的な慣行ですか?
解決
スマートポインタータイプクラスにメンバーポインターを保存したいだけなので、削除することを忘れない/忘れない場合、標準の選択肢は次のとおりです。 auto_ptr
. 。それはSTLにあり、で簡単に「リセット」されます reset()
機能に割り当てられた現在のメモリをリリースし、新しいオブジェクトに置き換える必要がある場合。
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は参照カウントを行いますが、それらを標準コンテナに保存することができ、非常に便利です。
最終的には、削除する責任がある割り当てられたメモリを指すものに対して、プレーンポインターを使用することを取り除く必要があります。プレーンオールアレイなどにアクセスまたは繰り返すためにプレーンポインターを使用したい場合は、それは問題ありません(ただし、STD :: Vectorを使用していない理由を自問してください)が、それらを使用して何かを指すとき解放する責任があり、トラブルを求めています。コードを書くときの私の目標は、明示的な削除を持たないことです。
他のヒント
使用できます std::auto_ptr
, 、TR1より前に利用可能であったため、コードはTR1-SMARTPOINTERSをサポートするコンパイラに依存しません。
通常、deep_copy_ptrを使用します。今、私はこれを行うloki smart_ptrとaxter smartポインターを知っています。これにより、ポインタークラスを通常のメンバー変数である場合に自動的にコピーすることができます(特別な割り当てオペレーター/コピーコンストラクターを定義する必要はありません)。
初期化リストで具体的に初期化する必要はないと思います(ただし、通常のポインターのように、有効な値がない場合は使用しないでください)。