1. ホーム
  2. c++

[解決済み] new演算子よりstd::make_uniqueを使うメリット【重複あり

2022-04-27 12:55:02

質問

を使うメリットは何ですか? std::make_unique よりも new 演算子で初期化することができます。 std::unique_ptr ?

言い換えれば、なぜ

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

するよりも

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

ネットでいろいろ調べてみたのですが、確かに演算子を避けるのが鉄則です。 new しかし、このシナリオでどのような利点があるかはわかりません。メモリリークを防ぐことができるのでしょうか?を実行した方が速いのでしょうか? std::make_unique を使用するよりも new ?

解決方法は?

メリット

  • make_unique は、ユーザーに「絶対言ってはいけないこと」を教えています。 new / deletenew[] / delete[] "免責事項なし。

  • make_unique とは、次の2つの点で共通しています。 make_shared (第3の利点である効率化を除く)。まず unique_ptr<LongTypeName> up(new LongTypeName(args)) には、必ず LongTypeName を2回、一方 auto up = make_unique<LongTypeName>(args) は1回です。

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

  • make_unique は例外の安全性のために慎重に実装されており、直接 unique_ptr のコンストラクタを使用します。

使用しない場合 make_unique

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

情報源

  1. の提案 std::make_unique .
  2. Herb Sutter's GotW #89 Solution: スマートポインター