を初期化するためにstd::make_unique
over演算子を使用する利点は何ですか?new
std::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
決して言わない」よりも簡単です。)new
unique_ptr
make_unique
例外安全性のために慎重に実装されており、unique_ptr
コンストラクターを直接呼び出すよりも推奨されます。
使用してはいけない場合make_unique
make_unique
カスタム削除子が必要な場合、または他の場所から生のポインターを採用する場合は使用しないでください。