5

1 つの関数からの出力として、 type のオブジェクトを取得しますFoo。別のクラスへの引数として、 type のオブジェクトを渡す必要がありますstd::shared_ptr<Foo>。元のオブジェクトから共有ポインタを作成するにはどうすればよいですか?

4

5 に答える 5

7

これは非常に簡単です。

auto val = std::make_shared<Foo>(FuncThatReturnsFoo(...));

基本的には、ヒープに新しいものを割り当てFoo、結果をコピー/移動するだけです。

于 2012-08-16T17:18:02.910 に答える
5

もし私があなただったら、私はそれをしません。主に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();
于 2012-08-16T17:16:44.750 に答える
1

これを行うには2つの方法があります。

  1. ヒープ上に新しいコピーを作成し、そこからshared_ptrを作成します。
  2. null削除機能を使用してそれからshared_ptrを作成します。

最初は書くことによって行うことができます

auto newPtr = std::make_shared<Foo>( foo );

クラスFooがコピー構築可能である場合、これは機能します。2番目のことはによって達成することができます

auto newPtr = std::shared_ptr<Foot>( &foo, [](void*){} );

ここでは、オブジェクトの新しいコピーを作成しません。fooただし、これは、スコープ外になった後、ポインターがアクセスされないことを保証できる場合にのみ安全です。そうしないと、破壊されたオブジェクトにアクセスし、プログラムがランダムな処理を実行する可能性があります。

于 2012-08-16T17:36:32.273 に答える
1

ヒープ割り当てを防ぎたいと思われます。それ以外の場合は、返されたオブジェクトのコピーをヒープ割り当てして先に進みます。

デリーターが実際に何かを削除するのを防ぐ必要があり、スタックがこれを処理する必要があります。

// 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 を受け入れるのでしょう か?

于 2012-08-16T17:22:31.873 に答える
0

あなたはこれを行うことができます

std::shared_ptr<Foo> ptr(new Foo(f());

意味的には、戻り値のコピーを作成していますが、コピー コンストラクターは省略される必要があります。

于 2012-08-16T17:18:22.937 に答える