2017-07-27 1 views
0

fn()の結果がconst std::shared_ptr<SomeType>の場合、結果をクライアントに保存するのに最適なタイプは何ですか?shared_ptrの結果を保存するには?

すなわち:

auto result = fn(); 

m_myResult = result.get() //or something 

m_myResult何種類をすべきですか? SomeType *? またはSomeType? またはshared_ptr<SomeType>

+6

掲載関数が共有ポインタを返すのはなぜですか? – juanchopanza

+5

どうして 'std :: shared_ptr '? –

+0

[shared_ptr :: get](http://en.cppreference.com/w/cpp/memory/shared_ptr/get)は 'T *'を返します。 – mch

答えて

2

shared_ptr<>は、メモリリソースの共有所有権を表すために使用されます。すべての(適切に作成された)shared_ptr<>は、同じオブジェクトを指しています。そのオブジェクトは、その最後のshared_ptr<>が破棄されたときにのみ削除されます(またはreset()、下記参照)。したがって、もしあなたが

auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT 
raw_ptr->member_func(); // may crash 

そしてshared_ptr<>fn()から返さすぐに破壊されてしまうと、オブジェクトへの尖ったもあってもよく、またはそれはいつでも後で破壊することができます。この場合、raw_ptrdangling pointerになります。それを避けるために、あなたは生きているshared_ptr<>オブジェクトを保つことによって所有権を保持する必要があります:

auto ptr = fn();   // move shared_ptr<>: pass ownership 
ptr->member_func();  // fine (unless fn() returned an empty pointer) 

今すぐptrによって管理されるオブジェクトはptr自体前に削除されることはありませんそれは、ない限り、あなたが明示的にreset()です:

ptr.reset();    // removes ownership from ptr 
関連する問題