C ++ 11標準ライブラリには、std::shared_ptr
からstd::unique_ptr
、またはその逆に変換するユーティリティが用意されていますか?これは安全な操作ですか?
shared_ptr
。
C ++ 11標準ライブラリには、std::shared_ptr
からstd::unique_ptr
、またはその逆に変換するユーティリティが用意されていますか?これは安全な操作ですか?
shared_ptr
。
回答:
std::unique_ptr
は、排他的な所有権を表現するC ++ 11の方法ですが、その最も魅力的な機能の1つは、簡単かつ効率的にに変換できることstd::shared_ptr
です。これは、
std::unique_ptr
ファクトリ関数の戻り値型として非常に適している理由の重要な部分です。ファクトリ関数は、呼び出し元が返すオブジェクトに排他的所有権セマンティクスを使用するかどうか、または共有所有権(つまり、std::shared_ptr
)がより適切かどうかを認識できません。を返すことでstd::unique_ptr
、ファクトリは呼び出し元に最も効率的なスマートポインタを提供しますが、呼び出し元がより柔軟な兄弟に置き換えることを妨げません。
std::shared_ptr
tostd::unique_ptr
は許可されていません。リソースのライフタイム管理をに引き渡した後はstd::shared_ptr
、気が変わることはありません。参照カウントが1つであっても、リソースをstd::unique_ptr
管理するためなどにリソースの所有権を取り戻すことはできません。参照:効果的な最新のC ++。C ++ 11およびC ++ 14の使用を改善するための42の特定の方法。スコットマイヤーズ。
要するに、あなたは簡単かつ効率的に変換することができますstd::unique_ptr
にstd::shared_ptr
はできますが、変換することはできませんstd::shared_ptr
しstd::unique_ptr
。
例えば:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
または:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
をに割り当てた場合、実際には防止(または警告さえ)しないことに注意してくださいstd::shared_ptr
。
unique_ptr u_ptrを指定して、shared_ptr s_ptrを作成します。
std::shared_ptr<whatever> s_ptr(u_ptr.release());
逆方向に進むのは実際的ではありません。
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
内部に保存されているデータを失う可能性があるため、安全ではありませんunique_ptr