[解決済み] new演算子よりstd::make_uniqueを使うメリット【重複あり
質問
を使うメリットは何ですか?
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
/delete
とnew[]
/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
は、カスタムデレタが必要な場合や、他の場所から生のポインタを採用する場合です。
情報源
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] std::vector に対する反復処理: 符号なしインデックス変数と符号ありインデックス変数の比較
-
[解決済み] C++の参照変数を返す習慣は悪なのか?
-
[解決済み] forループに対するstd::for_eachの優位性
-
[解決済み] std::make_unique と std::unique_ptr の new による違い
-
[解決済み] 参照渡しより値渡し、std::moveの方が優れている点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] std::make_unique と std::unique_ptr の new による違い