boost:shared_ptr
オブジェクトを作成する最も標準的な方法はmake_shared
、Boost が提供する関数を使用することです。
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
struct A {};
A generator() {
return A();
}
int main()
{
using namespace boost;
shared_ptr<A> p = make_shared<A>(generator());
return 0;
}
generator()
関数は値によってオブジェクトを返すため、A
上記の構文new
は が のコピー コンストラクターで呼び出されA
、結果のポインターが共有ポインター オブジェクトにラップされることを意味します。つまり、共有ポインタへの変換make_shared
を完全には実行しません。代わりに、ヒープ上にオブジェクトのコピーを作成し、そのためのメモリ管理を提供します。これは、必要なものである場合とそうでない場合があります。
これはC++11std::make_shared
の forと同等であることに注意してください。std::shared_ptr
質問で言及した便利な構文を提供する 1 つの方法は、変換演算子をshared_ptr<A>
forに定義することA
です。
struct A {
operator boost::shared_ptr<A>() {
return boost::make_shared<A>(*this);
}
};
次に、次のように使用できます。
shared_ptr<A> p = generate();
これにより、関数によって返されたオブジェクトが自動的に「変換」されます。繰り返しますが、ここでの変換とは、実際にはヒープの割り当て、コピー、および共有ポインターへのラップを意味します。したがって、このような便利な変換演算子を定義することをお勧めするかどうかはよくわかりません。これにより、構文が非常に便利になりますが、すべての暗黙的な変換演算子と同様に、予期しない場所でこれらの「変換」が暗黙的に発生することも意味する場合があります。