fn()
の結果がconst std::shared_ptr<SomeType>
の場合、結果をクライアントに保存するのに最適なタイプは何ですか?shared_ptrの結果を保存するには?
すなわち:
auto result = fn();
m_myResult = result.get() //or something
m_myResult
何種類をすべきですか? SomeType *
? またはSomeType
? またはshared_ptr<SomeType>
?
fn()
の結果がconst std::shared_ptr<SomeType>
の場合、結果をクライアントに保存するのに最適なタイプは何ですか?shared_ptrの結果を保存するには?
すなわち:
auto result = fn();
m_myResult = result.get() //or something
m_myResult
何種類をすべきですか? SomeType *
? またはSomeType
? またはshared_ptr<SomeType>
?
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_ptr
はdangling 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
掲載関数が共有ポインタを返すのはなぜですか? – juanchopanza
どうして 'std :: shared_ptr'? –
[shared_ptr :: get](http://en.cppreference.com/w/cpp/memory/shared_ptr/get)は 'T *'を返します。 – mch