2012-12-10 5 views

答えて

56

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

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

+5

@RedX:プレースメント 'new'のことを考えているなら、これはそれではありません(構文が異なります)。 – NPE

+14

@RedX:いいえ、 'int'値100を含む動的に割り当てられたアドレスを指します。' int * arr =(int *)100; ' –

+4

@SteveJessopまたはNPEが示唆するように、 'new(100)int'です。 –

8

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

new int[100](); 

これは割り当てます:

多くの人々はあなたが newに初期化子を渡すことができることを知らない

、より広く知られているmemsetの使用を避けるようになされるべきである特定のイディオムがありますintの配列を返し、その要素をゼロ初期化します。

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

+1

"もっと広く知られていなければならない特定のイディオム...あなたは新しいバージョンの配列を使うべきではありません" - なぜイディオムをもっと広く知らなければならないのですか? ;-) –

+1

@SteveJessop、良い点:)古いコードベースを修正する場合、 'new'を' vector'に置き換えるよりも 'memset'sを削除してかっこを追加するほうがはるかに簡単です。 – avakar

+0

@avakar、私はまだ何が意味するものを取得していない...新しいint [100](); 誰かがおそらく例で詳しく説明しています – eRaisedToX

0

最初のものは1つの新しい整数を作成し、100に初期化してポインタを返します。

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

+4

配列へのポインタは 'int(* arr)[100]'のように見え、C++では区別できます。配列を割り当てるときでも、 'new'は配列へのポインタを返しません。代わりに配列の最初の要素へのポインタを返します。その理由は、サイズが配列へのポインタの型の一部であり、もちろん 'new'は実行時に渡すサイズに応じて異なる型を返すことができないからです。 –

+2

"C++は配列の要素へのポインタと単一の値へのポインタを区別できません"引用の場合は –

21

Wikipedia new(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) 
+1

+1です。 – Richard

+2

@リチャードしかし、私はウィキペディアは信頼できる情報源ではないと教えられました! –

+4

@ AlvinWongそれはほとんど定義ではありません。唯一の "信頼性の高い"ソース(この問題のため)は、C++標準です(あなたが何かを引用している場合は引用する必要があります)。 –

関連する問題