私はこの回答を読んでいましたが、著者はブーストのベストプラクティスを参照しています。
入力を節約するために、名前のない shared_ptr 一時変数を使用しないでください。これが危険な理由を確認するには、次の例を検討してください。
void f(shared_ptr<int>, int);
int g();
void ok() {
shared_ptr<int> p(new int(2));
f(p, g());
}
void bad() {
f(shared_ptr<int>(new int(2)), g());
}
関数 ok は文字どおりガイドラインに従いますが、bad は一時的な shared_ptr を所定の場所に構築し、メモリ リークの可能性を認めます。関数の引数は指定されていない順序で評価されるため、new int(2) が最初に評価され、g() が 2 番目に評価される可能性があり、g が例外をスローした場合、shared_ptr コンストラクターに到達しない可能性があります。<...>
上記の例外の安全性の問題は、boost/make_shared.hpp で定義されている make_shared または allocate_shared ファクトリ関数を使用することによっても解消される場合があります。これらのファクトリ関数は、割り当てを統合することによって効率の利点も提供します。
を使い始めるとmake_shared
思いますが、このちょっとしたアドバイスが C++11 にも当てはまるかどうか疑問に思っていましたshared_ptr
。g()
スローするとctorが呼び出されなくなる理由がよくわからないので、質問します。