5

私は(誤って)私のプログラムで次の課題を持っていました:

std::shared_ptr<SI::Program> m_program; // in class

m_program = std::make_unique<SI::Program>(); // in method

これを見つけたとき、なぜこれがコンパイルされるのか最初に疑問に思いました。には、オブジェクトshared_ptr用の特別な移動代入演算子があることがわかりました。unique_ptr

私の質問は、これは常に安全に行うことができるのでしょうか、それとも何らかの意味がありますか?

(コードの実行に関しては安全です。コード レビューに関しては明らかに安全ではありません...)

4

2 に答える 2

7

二重削除やその他の問題が発生しないという意味で、そうすることは「安全」です。

次の理由により、そうするのは適切ではありません。

  1. 誤解を招く可能性があります-make_unique共有ではなく、一意のポインターを作成するために使用されます。
  2. 無駄です -make_unique関連する制御ブロックではなく、オブジェクトのみを割り当てます。shared_ptrこれにより、コンストラクターに制御ブロック自体を割り当てるように強制されます。std::make_shared両方を 1 つの割り当てに割り当てると、はるかに効率的です。
于 2016-08-18T15:29:14.343 に答える
5

はい、それは完全に安全です。by moveshared_ptrから所有権を転送できるコンストラクターがあります。適切unique_ptrに呼び出すほど効率的ではありませんが。make_shared

于 2016-08-18T15:28:04.117 に答える