new 演算子よりも std::make_unique を使用する利点 [重複] 質問する

new 演算子よりも std::make_unique を使用する利点 [重複] 質問する

を初期化するためにstd::make_uniqueover演算子を使用する利点は何ですか?newstd::unique_ptr

つまり、なぜ

std::unique_ptr<SomeObject> a = std::make_unique(SomeObject(...))

するよりも良い

std::unique_ptr<SomeObject> a = new SomeObject(...)

オンラインでいろいろ調べてみたところ、現代の C++ では 演算子を避けるのが原則であることはわかっていますnewが、このシナリオでどのような利点があるのか​​よくわかりません。 発生する可能性のあるメモリ リークを防ぐことができますか? をstd::make_unique使用するよりも を使用する方が速いですかnew?

ベストアンサー1

利点

  • make_unique免責事項なしで「new/deleteおよびnew[]/を決して言わないdelete[]」ことをユーザーに教えます。

  • make_uniqueは と 2 つの利点を共有していますmake_shared(3 番目の利点である効率性の向上を除く)。まず、は 2 回unique_ptr<LongTypeName> up(new LongTypeName(args))言及する必要がありますLongTypeNameが、auto up = make_unique<LongTypeName>(args)は 1 回言及しています。

  • make_uniqueのような式によって引き起こされる、指定されていない評価順序のリークを防ぎますfoo(unique_ptr<X>(new X), unique_ptr<Y>(new Y))。(「 を決して言わない」というアドバイスに従うことは、「をすぐに名前付き に与えない限り、 をnew決して言わない」よりも簡単です。)newunique_ptr

  • make_unique例外安全性のために慎重に実装されており、unique_ptrコンストラクターを直接呼び出すよりも推奨されます。

使用してはいけない場合make_unique

  • make_uniqueカスタム削除子が必要な場合、または他の場所から生のポインターを採用する場合は使用しないでください。

出典

  1. 提案std::make_unique
  2. ハーブ・サッターの GotW #89 解答: スマートポインター

おすすめ記事