1 つの関数からの出力として、 type のオブジェクトを取得しますFoo
。別のクラスへの引数として、 type のオブジェクトを渡す必要がありますstd::shared_ptr<Foo>
。元のオブジェクトから共有ポインタを作成するにはどうすればよいですか?
5 に答える
これは非常に簡単です。
auto val = std::make_shared<Foo>(FuncThatReturnsFoo(...));
基本的には、ヒープに新しいものを割り当てFoo
、結果をコピー/移動するだけです。
もし私があなただったら、私はそれをしません。主にstd::shared_ptr
メモリを管理するためですが、オブジェクトをリターンタイプとして取得した場合、メモリは自動的に管理されます(通常、ほとんどの場合)。
動的ストレージに新しいオブジェクトを作成する必要があります
Foo getObject();
//...
std::shared_ptr<Foo> ptr(new Foo(getObject())); //construct new object in dynamic memory
//using the copy constructor
または、関数を変更して、メモリを管理しているオブジェクトへのポインタを返します。
Foo getObject();
//becomes
Foo* getObject();
//or, even better
std::shared_ptr<Foo> getObject();
これを行うには2つの方法があります。
- ヒープ上に新しいコピーを作成し、そこからshared_ptrを作成します。
- null削除機能を使用してそれからshared_ptrを作成します。
最初は書くことによって行うことができます
auto newPtr = std::make_shared<Foo>( foo );
クラスFoo
がコピー構築可能である場合、これは機能します。2番目のことはによって達成することができます
auto newPtr = std::shared_ptr<Foot>( &foo, [](void*){} );
ここでは、オブジェクトの新しいコピーを作成しません。foo
ただし、これは、スコープ外になった後、ポインターがアクセスされないことを保証できる場合にのみ安全です。そうしないと、破壊されたオブジェクトにアクセスし、プログラムがランダムな処理を実行する可能性があります。
ヒープ割り当てを防ぎたいと思われます。それ以外の場合は、返されたオブジェクトのコピーをヒープ割り当てして先に進みます。
デリーターが実際に何かを削除するのを防ぐ必要があり、スタックがこれを処理する必要があります。
// given the signatures
Foo f();
void other(std::shared_ptr<Foo> x);
Foo my_f = f();
std::shared_ptr<Foo> my_fptr{&my_f, [](Foo*) {}};
other(my_fptr);
ただし、それは本当のコードの匂いです。shared_ptr
寿命を延ばさない場合、なぜ関数が a を受け入れるのでしょう
か?
あなたはこれを行うことができます
std::shared_ptr<Foo> ptr(new Foo(f());
意味的には、戻り値のコピーを作成していますが、コピー コンストラクターは省略される必要があります。