std::shared_ptr
C++11 標準ライブラリには、 からへ、またはその逆の変換を行うユーティリティが用意されていますかstd::unique_ptr
? この操作は安全ですか?
ベストアンサー1
std::unique_ptr
は、排他的所有権を表現する C++11 の方法です。しかし、その最も魅力的な機能の 1 つは、簡単かつ効率的に に変換できることですstd::shared_ptr
。
std::unique_ptr
これは、 がファクトリ関数の戻り型として非常に適している理由の重要な部分です。ファクトリ関数は、呼び出し元が返すオブジェクトに対して排他的所有権セマンティクスを使用するかどうか、または共有所有権 (つまりstd::shared_ptr
) の方が適切かどうかを知ることはできません。 を返すことによりstd::unique_ptr
、ファクトリは呼び出し元に最も効率的なスマート ポインターを提供しますが、呼び出し元がそれをより柔軟な兄弟に置き換えることを妨げることはありません。
std::shared_ptr
はstd::unique_ptr
許可されません。リソースの有効期間管理を に引き渡したらstd::shared_ptr
、考えを変えることはできません。参照カウントが 1 であっても、たとえば に管理させるためにリソースの所有権を取り戻すことはできませんstd::unique_ptr
。参考資料: Effective Modern C++。C++11 と C++14 の使用を改善するための 42 の具体的な方法。Scott Meyers。
つまり、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");