重複の可能性:
これは変数または関数ですか?
私は誤って次のようなものを使用しました:
int *arr = new int(100);
コンパイルにはパスしますが、これが間違っていることはわかっていました。そのはず
int *arr = new int[100];
私が間違ったものを書いたとき、コンパイラはそれが何だと思いますか?
重複の可能性:
これは変数または関数ですか?
私は誤って次のようなものを使用しました:
int *arr = new int(100);
コンパイルにはパスしますが、これが間違っていることはわかっていました。そのはず
int *arr = new int[100];
私が間違ったものを書いたとき、コンパイラはそれが何だと思いますか?
最初の行はシングルintを割り当て、それを に初期化し100ます。int(100)コンストラクター呼び出しと考えてください。
これはスカラー割り当てであるため、arr[1]使用してメモリにアクセスまたは解放しようとするとdelete[]、未定義の動作が発生します。
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++) では、この例は削除されています。
type の 1 つのオブジェクトを割り当てint、それを value に初期化します100。
多くの人は、初期化子を に渡すことができることを知りません。new使用を避けるために、より広く知られるべき特定のイディオムがありますmemset。
new int[100]();
これにより、配列が割り当てられ、intその要素がゼロで初期化されます。
また、配列バージョンのnew. これまで。そのstd::vectorためにあります。
最初のものは単一の新しい整数を作成し、それを値 100 に初期化し、それへのポインターを返します。
C/C++ では、配列へのポインターと単一の値へのポインターの間に違いはありません (実際、配列へのポインターは、最初の要素へのポインターにすぎません)。したがって、これは 1 つの要素を持つ配列を作成する有効な方法です。