重複の可能性:
これは変数または関数ですか?
私は誤って次のようなものを使用しました:
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 つの要素を持つ配列を作成する有効な方法です。