ブーストのmake_shared()
関数は、shared_ptr
を作成しようとする際に例外から安全であることが保証されています。なぜboostにmake_scoped()がないのですか?
make_scoped()
はなぜ同じですか?共通のベストプラクティスはありますか?ここで
は私には安全ではないと思われるboost::scoped_ptr
documentationからのコードの例です:
boost::scoped_ptr<Shoe> x(new Shoe);
このコード行は順番にこれら三つを行います。
Shoe
のヒープ・メモリを割り当て- のコンストラクタを呼び出す
Shoe
- は
Shoe
のコンストラクタが例外をスローした場合、メモリがリークされますboost::scoped_ptr<Shoe>
のコンストラクタを呼び出します。
(R. Martinho Fernandesの回答を参照)scoped_ptr
はまだ構築されていないため、割り当て解除を処理しません。
これは見落としですか?それとも、私が気付かなかった解決策がありますか?
この例は安全ですが、 'f(boost :: scoped_ptr(new Shoe)、g());'ではありません。問題を解決するためのコーディング慣行:常にスマートポインタの名前を変数またはメンバに指定し、仮のサブ式としてスマートポインタを構成しないでください。 –
aschepler