1. ホーム
  2. c++

[解決済み] std::make_unique と std::unique_ptr の new による違い

2022-04-25 04:01:23

質問

はたして std::make_unique のような効率的な利点があります。 std::make_shared ?

を手動で構築するのに比べ std::unique_ptr :

std::make_unique<int>(1);         // vs
std::unique_ptr<int>(new int(1));

解決方法は?

の動機は? make_unique は、主に2つあります。

  • make_unique はテンポラリの作成に安全ですが、明示的に new を使用する場合は、名前のないテンポラリーを使用しないという規則を覚えておく必要があります。

    foo(make_unique<T>(), make_unique<U>()); // exception safe
    
    foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*
    
    
  • を追加しました。 make_unique を「絶対に」使用しないよう指示できるようになりました。 new を使用することはできません。 new を作るとき以外は unique_ptr "です。

3つ目の理由もあります。

  • make_unique は、冗長な型の使用を必要としません。 unique_ptr<T>(new T()) -> make_unique<T>()

を使用した場合のような実行効率の向上は、いずれの理由にも含まれていません。 make_shared (2回目の割り当てを回避できるため、ピーク時のメモリ使用量が増える可能性があります)。

* C++17では、これがもはや安全でないことを意味するルール変更が含まれることが期待されています。C++ 委員会資料を参照 P0400R0 P0145R3 .