可能性のある複製:
これは変数または関数ですか
私は間違って次のようなものを使用しました:
int *arr = new int(100);
コンパイルはパスしますが、これは間違っていることはわかっていました。そのはず
int *arr = new int[100];
間違ったものを書いたとき、コンパイラはそれをどう思いますか?
最初の行は単一のint
を割り当て、それを100
に初期化します。int(100)
をコンストラクター呼び出しと考えてください。
これはスカラー割り当てであるため、arr[1]
にアクセスするか、delete[]
を使用してメモリを解放しようとすると、動作が未定義になります。
Wikipedia new(C++) quote:
int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors)
int *p_array = new int[5]; //allocates an array of 5 adjacent integers. (undefined values)
現在のウィキペディアの記事では new
およびdelete
(C++) の例は削除されています。
タイプint
のオブジェクトを1つ割り当て、それを値100
に初期化しました。
多くの人は、イニシャライザーをnew
に渡すことができることを知りません。memset
の使用を避けるために、より広く知られるべき特定のイディオムがあります。
new int[100]();
これにより、int
の配列が割り当てられ、その要素がゼロで初期化されます。
また、new
の配列バージョンを使用しないでください。今まで。そのためにstd::vector
があります。
最初のものは、単一の新しい整数を作成し、値100に初期化し、それへのポインターを返します。
C/C++では、配列へのポインターと単一の値へのポインターに違いはありません(実際、配列へのポインターは、その最初の要素へのポインターにすぎません)。したがって、これは1つの要素を持つ配列を作成する有効な方法です。