web-dev-qa-db-ja.com

「new int(100)」は何をしますか?

可能性のある複製:
これは変数または関数ですか

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

int *arr = new int(100);

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

int *arr = new int[100];

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

37
JASON

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

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

62
NPE

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++) の例は削除されています。

さらに、 new および new[]

23
Peopleware

タイプintのオブジェクトを1つ割り当て、それを値100に初期化しました。

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

new int[100]();

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

また、newの配列バージョンを使用しないでください。今まで。そのためにstd::vectorがあります。

9
avakar

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

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

0
Philipp