C++ で new キーワードはいつ使用すればよいですか? [重複] 質問する

C++ で new キーワードはいつ使用すればよいですか? [重複] 質問する

私は C++ をしばらく使用していますが、このnewキーワードについて疑問に思っています。簡単に言えば、このキーワードを使用するべきでしょうか、それとも使用すべきではないでしょうか?

  1. キーワードでnew...
    MyClass* myClass = new MyClass();
    myClass->MyField = "Hello world!";
  1. キーワードがなければnew...
    MyClass myClass;
    myClass.MyField = "Hello world!";

実装の観点から見ると、それほど違いはないように見えます (しかし、違いがあると確信しています)... ただし、私の主な言語は C# であり、もちろん 1 番目の方法が私が慣れている方法です。

難しいのは、方法 1 は標準 C++ クラスでは使いにくいということのようです。

どちらの方法を使用すればよいですか?

アップデート1:

最近、スコープ外になる (つまり、関数から返される) 大きな配列に、newキーワード for heap memory (またはfree store ) を使用しました。以前はスタックを使用していたため、スコープ外の要素の半分が破損していましたが、ヒープの使用に切り替えると、要素がそのまま維持されました。やった!

アップデート2:

最近、友人から、newキーワードの使用には簡単なルールがあると聞きました。それは、 と入力するたびにnew、 と入力するということですdelete

    Foobar *foobar = new Foobar();
    delete foobar; // TODO: Move this to the right place.

これは、削除を常にどこかに配置する必要があるため (つまり、デストラクタなどに切り取って貼り付ける場合)、メモリ リークを防ぐのに役立ちます。

ベストアンサー1

方法1( を使用new

  • オブジェクトにメモリを割り当てます無料ストア(これはヒープと同じものであることが多い)
  • 後でオブジェクトを明示的に削除する必要がありますdelete。(削除しないと、メモリ リークが発生する可能性があります)
  • メモリは、使用するまで割り当てられたままになります。(つまり、を使用して作成したオブジェクトdeleteを使用できます)returnnew
  • 質問の例はメモリリークただし、ポインタがdeleted の場合は除きます。また、どの制御パスが取られるか、または例外がスローされるかどうかに関係なく、常に削除する必要があります。

方法2( を使用しないnew

  • スタック上のオブジェクトにメモリを割り当てます(すべてのローカル変数が配置される場所)。通常、スタックに使用できるメモリは少なくなるため、割り当てるオブジェクトが多すぎると、スタック オーバーフローが発生する危険があります。
  • 後から必要になることはありませんdelete
  • メモリはスコープ外になると割り当てられなくなります。(つまり、returnスタック上のオブジェクトへのポインターは使用しないでください)

どちらを使用するかについては、上記の制約を考慮して、自分に最適な方法を選択してください。

簡単なケースをいくつか挙げます:

  • 電話をかけることを心配したくない場合はdelete(そして、メモリリーク) は使用しないでくださいnew
  • 関数からオブジェクトへのポインタを返す場合は、new

おすすめ記事