C ++ 11のunique_ptrとshared_ptrは互いの型に変換できますか?


99

C ++ 11標準ライブラリには、std::shared_ptrからstd::unique_ptr、またはその逆に変換するユーティリティが用意されていますか?これは安全な操作ですか?


「安全運転」を定義してください。どのような安全性を求めていますか?生涯管理安全?スレッドセーフ?
jaggedSpire 2016年

2
「STL」は標準ライブラリを意味しません。STLはとは関係ありませんshared_ptr
curiousguy 16

1
@jaggedSpireスレッドの安全性はすなわち、使用回数が1ではない、あなたが別のスレッドで使用される所有者を持っている意味します
curiousguy

@curiousguy私は知っていました。OPの質問では「安全性」は明確に定義されておらず、複数の種類があるため、どのような「安全性」を意味するのかを明確にする必要がありました。
jaggedSpire 2016

回答:


161

std::unique_ptrは、排他的な所有権を表現するC ++ 11の方法ですが、その最も魅力的な機能の1つは、簡単かつ効率的にに変換できることstd::shared_ptrです。

これは、std::unique_ptrファクトリ関数の戻り値型として非常に適している理由の重要な部分です。ファクトリ関数は、呼び出し元が返すオブジェクトに排他的所有権セマンティクスを使用するかどうか、または共有所有権(つまり、std::shared_ptr)がより適切かどうかを認識できません。を返すことでstd::unique_ptr、ファクトリは呼び出し元に最も効率的なスマートポインタを提供しますが、呼び出し元がより柔軟な兄弟に置き換えることを妨げません。

std::shared_ptrto std::unique_ptrは許可されていません。リソースのライフタイム管理をに引き渡した後はstd::shared_ptr、気が変わることはありません。参照カウントが1つであっても、リソースをstd::unique_ptr管理するためなどにリソースの所有権を取り戻すことはできません。

参照:効果的な最新のC ++。C ++ 11およびC ++ 14の使用を改善するための42の特定の方法。スコットマイヤーズ。

要するに、あなたは簡単かつ効率的に変換することができますstd::unique_ptrstd::shared_ptrはできますが、変換することはできませんstd::shared_ptrstd::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");

9
...どうやってやるの?
ジェイク、

4
@ジェイク私は例を追加しました
chema989

許可されていませんが、コンパイラー(少なくともgccではない)は、誤って(例えば、メンバー変数のポインター型を変更することによって)a std::unique_ptrをに割り当てた場合、実際に防止(または警告さえ)しないことに注意してくださいstd::shared_ptr
StefanQ

-8

unique_ptr u_ptrを指定して、shared_ptr s_ptrを作成します。

std::shared_ptr<whatever> s_ptr(u_ptr.release());

逆方向に進むのは実際的ではありません。


29
ここで「正しい」方法があります:std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
emlai

6
:そして、ここで衒学的「正しい」方法であるstd::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
polyvertex

3
安全性が低いのは何ですか?
nmr 2018

7
@VioletGiraffe•ポリバーテックスが新しい初期化リスト構文を使用することを推奨していると思います。これにより、サイレントなナローイング変換を回避し、メンバーの初期化に統一された構文で対応するのが良い習慣になります。1つは6つ、もう1つは6つですか?
エルジェイ2018

8
@nmr Deleter内部に保存されているデータを失う可能性があるため、安全ではありませんunique_ptr
Zang MingJie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.