私は C++ をしばらく使用していますが、このnew
キーワードについて疑問に思っています。簡単に言えば、このキーワードを使用するべきでしょうか、それとも使用すべきではないでしょうか?
- キーワードで
new
...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
- キーワードがなければ
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
を使用できます)return
new
- 質問の例はメモリリークただし、ポインタが
delete
d の場合は除きます。また、どの制御パスが取られるか、または例外がスローされるかどうかに関係なく、常に削除する必要があります。
方法2( を使用しないnew
)
- スタック上のオブジェクトにメモリを割り当てます(すべてのローカル変数が配置される場所)。通常、スタックに使用できるメモリは少なくなるため、割り当てるオブジェクトが多すぎると、スタック オーバーフローが発生する危険があります。
- 後から必要になることはありません
delete
。 - メモリはスコープ外になると割り当てられなくなります。(つまり、
return
スタック上のオブジェクトへのポインターは使用しないでください)
どちらを使用するかについては、上記の制約を考慮して、自分に最適な方法を選択してください。
簡単なケースをいくつか挙げます:
- 電話をかけることを心配したくない場合は
delete
(そして、メモリリーク) は使用しないでくださいnew
。 - 関数からオブジェクトへのポインタを返す場合は、
new