1. ホーム
  2. c++

[解決済み】C++でnewキーワードはいつ使うべきですか?

2022-03-26 19:14:13

質問

C++を使い始めて間もないのですが、この間は new というキーワードがあります。単純に、使うべきなのか、使わないべきなのか?

  1. と共に new キーワード...
    MyClass* myClass = new MyClass();
    myClass->MyField = "Hello world!";

  1. がない場合 new キーワード...
    MyClass myClass;
    myClass.MyField = "Hello world!";

実装的には、そんなに変わらないような気もしますが......(でも、きっとそうなんでしょう)。しかし、私の主要言語はC#であり、当然ながら1stメソッドの方が慣れているのです。

方法1の方が標準C++のクラスで使いにくいようです。

どの方法を使えばいいのでしょうか?

アップデート1:

最近、私は new キーワードで ヒープ メモリ(または フリーストア を、スコープ外に出る (関数から返される) 大きな配列のために使用しました。) 以前はスタックを使っていたので、要素の半分がスコープ外で壊れていたのですが、ヒープ使用に切り替えたことで要素が無傷であることが確認できました。やったー!

更新2:

最近、友人から new キーワードを入力するたびに new と入力します。 delete .

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

これは、deleteを常にどこかに置かなければならないので、メモリリークを防ぐのに役立ちます(つまり、デストラクタかその他のいずれかにカット&ペーストするとき)。

解決方法は?

方法1(使用 new )

  • にオブジェクト用のメモリを確保する。 フリーストア (と同じであることが多い)。 ヒープ )
  • を明示的に指定する必要があります。 delete オブジェクトを後で削除します。 (削除しないとメモリリークを起こす可能性があります)
  • を実行するまで、メモリは確保されたままです。 delete となります。 (すなわち、あなたは return を使って作成したオブジェクトを new )
  • 質問の例では メモリリーク ポインタが delete d; そしてそれは は常に削除されるべきです。 どの制御パスが使われようが、例外が投げられようが、です。

方法2(使用しない) new )

  • にオブジェクト用のメモリを確保する。 スタック (すべてのローカル変数が入る場所) 一般に、スタックに使えるメモリは少なく、オブジェクトを多く割り当てると、スタックオーバーフローの危険があります。
  • は必要ないでしょう。 delete を、後で確認することができます。
  • スコープ外になったときにメモリが確保されなくなった。 (すなわち、あなたは return スタック上のオブジェクトへのポインタ)

どれを使うかについては、上記の制約を踏まえた上で、自分にとって最適な方法を選択します。

簡単なケースをいくつか紹介します。

  • を呼び出すことを気にしたくない場合は、以下のようにします。 delete を引き起こす可能性がある)。 メモリリーク を使うべきではありません。 new .
  • 関数からオブジェクトへのポインタを返したい場合は new