47

重複の可能性:
これは変数または関数ですか?

私は誤って次のようなものを使用しました:

int *arr = new int(100);

コンパイルにはパスしますが、これが間違っていることはわかっていました。そのはず

int *arr = new int[100];

私が間違ったものを書いたとき、コンパイラはそれが何だと思いますか?

4

4 に答える 4

70

最初の行はシングルintを割り当て、それを に初期化し100ます。int(100)コンストラクター呼び出しと考えてください。

これはスカラー割り当てであるため、arr[1]使用してメモリにアクセスまたは解放しようとするとdelete[]、未定義の動作が発生します。

于 2012-12-10T09:15:49.857 に答える
27

ウィキペディアの新しい (C++)の引用:

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)

アップデート

現在のウィキペディアの記事newdelete(C++) では、この例は削除されています。

さらに、直感的ではありませんが完全に信頼できる と の C++ リファレンスを次に示しnewますnew[]

于 2012-12-10T09:17:58.303 に答える
11

type の 1 つのオブジェクトを割り当てint、それを value に初期化します100

多くの人は、初期化子を に渡すことができることを知りません。new使用を避けるために、より広く知られるべき特定のイディオムがありますmemset

new int[100]();

これにより、配列が割り当てられ、intその要素がゼロで初期化されます。

また、配列バージョンのnew. これまで。そのstd::vectorためにあります。

于 2012-12-10T09:15:52.023 に答える
0

最初のものは単一の新しい整数を作成し、それを値 100 に初期化し、それへのポインターを返します。

C/C++ では、配列へのポインターと単一の値へのポインターの間に違いはありません (実際、配列へのポインターは、最初の要素へのポインターにすぎません)。したがって、これは 1 つの要素を持つ配列を作成する有効な方法です。

于 2012-12-10T09:16:56.880 に答える