[解決済み】C++でnewキーワードはいつ使うべきですか?
2022-03-26 19:14:13
質問
C++を使い始めて間もないのですが、この間は
new
というキーワードがあります。単純に、使うべきなのか、使わないべきなのか?
-
と共に
new
キーワード...
MyClass* myClass = new MyClass();
myClass->MyField = "Hello world!";
-
がない場合
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
関連
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] JavaScriptの「new」キーワードとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された