私が間違ってのようなものを使用:
int *arr = new int(100);
をし、それがコンパイル渡し、私はこれは間違っている知っていました。それはする必要があります
int *arr = new int[100];
私は間違ったものを書いたときにコンパイラは何と思いますか?
私が間違ってのようなものを使用:
int *arr = new int(100);
をし、それがコンパイル渡し、私はこれは間違っている知っていました。それはする必要があります
int *arr = new int[100];
私は間違ったものを書いたときにコンパイラは何と思いますか?
最初の行は、int
を1つ割り当てて、100
に初期化します。int(100)
をコンストラクタ呼び出しと考えてください。
これはスカラー割り当てであるため、arr[1]
にアクセスしようとするか、delete[]
を使用してメモリを解放しようとすると、未定義の動作につながります。
タイプint
の1つのオブジェクトを割り当て、値100
に初期化します。
new int[100]();
これは割り当てます:
多くの人々はあなたがnew
に初期化子を渡すことができることを知らない
、より広く知られているmemset
の使用を避けるようになされるべきである特定のイディオムがありますint
の配列を返し、その要素をゼロ初期化します。
また、配列バージョンnew
を使用しないでください。これまでその目的のためにstd::vector
があります。
"もっと広く知られていなければならない特定のイディオム...あなたは新しいバージョンの配列を使うべきではありません" - なぜイディオムをもっと広く知らなければならないのですか? ;-) –
@SteveJessop、良い点:)古いコードベースを修正する場合、 'new'を' vector'に置き換えるよりも 'memset'sを削除してかっこを追加するほうがはるかに簡単です。 – avakar
@avakar、私はまだ何が意味するものを取得していない...新しいint [100](); 誰かがおそらく例で詳しく説明しています – eRaisedToX
最初のものは1つの新しい整数を作成し、100に初期化してポインタを返します。
C/C++では、配列へのポインタと単一の値へのポインタの間に違いはありません(配列へのポインタは実際には最初の要素へのポインタにすぎません)。したがって、これは1つの要素で配列を作成する有効な方法です。
配列へのポインタは 'int(* arr)[100]'のように見え、C++では区別できます。配列を割り当てるときでも、 'new'は配列へのポインタを返しません。代わりに配列の最初の要素へのポインタを返します。その理由は、サイズが配列へのポインタの型の一部であり、もちろん '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です。 – Richard
@リチャードしかし、私はウィキペディアは信頼できる情報源ではないと教えられました! –
@ AlvinWongそれはほとんど定義ではありません。唯一の "信頼性の高い"ソース(この問題のため)は、C++標準です(あなたが何かを引用している場合は引用する必要があります)。 –
@RedX:プレースメント 'new'のことを考えているなら、これはそれではありません(構文が異なります)。 – NPE
@RedX:いいえ、 'int'値100を含む動的に割り当てられたアドレスを指します。' int * arr =(int *)100; ' –
@SteveJessopまたはNPEが示唆するように、 'new(100)int'です。 –