私はいくつかのプロジェクトを使用しているboost::shared_ptr
か、std::shared_ptr
広範囲に使用しています(一方にこの質問に対する良い答えがあるが、もう一方にはない場合は、すぐにどちらかの実装に変換できます)。Boostの実装では、Boost.Assertを使用して、実行時operator*
またはoperator->
実行時に空(NULL)ポインターが検出された場合に戻らないようにします。一方、libc++の実装にはチェックが欠けているようです。
もちろん、shared_ptr
使用する前にaの有効性を確認する必要がありますが、大規模な混合パラダイムコードベースを使用すると、例外をスローするバリエーションを試してみたいと思うようになります。ほとんどのコードは比較的例外を認識しており、セグメンテーション違反ではなく、せいぜい高レベルで再開可能な状態に失敗するためstd::terminate()
です。
の堅牢性を維持しながら、これらのアクセサを最適にカスタマイズするにはどうすればよいshared_ptr
ですか?カプセル化shared_ptr
するのthrowing_shared_ptr
が最善の選択肢のようですが、私は魔法を破るのを警戒しています。Boostソースをコピーして、ASSERT
sを適切なthrow
ステートメントに変更するのが最善ですか?
適切な型のためにどこでも使用される実際の型名smart_ptr<T>
は、マクロから展開されたtypedefです。つまりForwardDeclarePtr(Class)
、次のように展開されます。
class Class;
typedef boost::smart_ptr<Class> ClassPtr;
すべてが合格、取得、または保存されるClassPtr
ので、基になる型をかなり自由に置き換えることができます。これにより、潜在的なスライス/非表示の問題が軽減されると思います。