1

int* array = new int [n];私はそれがヒープにメモリスペースを割り当てることを知っています。

しかし、そのようなことを宣言するとint array[n];、コードブロックでは正常にコンパイルされますが、Visual Studioに移動すると、エラーが発生します。

私が聞きたいのは:

  1. 実際には何をしint[n]、ヒープ割り当てと比較してどうですか?それらの違いは何ですか?

  2. int array[n]代わりに使用すると、どのようなエラーが発生する可能性がありint* array = new int [n];ますか?

4

4 に答える 4

4

int array[n]ヒープではなく、スタック上の配列を宣言します。標準のC++ではn、コンパイル時定数である必要がありますが、一部のコンパイラには、コンパイル時定数なしでこの形式で宣言された可変長配列を許可する拡張機能がありますn。これは標準ではなく、おそらく使用すべきではありません。

int array[n]いくつかの問題を引き起こす可能性がありますint* array = new int [n];

  • nが十分に大きい場合、スタックオーバーフローが発生する可能性があります。または、配列がクラスメンバーであり、クラスの大きな配列を作成する場合。
  • arrayクラスのメンバーが移動する場合、コピーと同じくらい費用がかかる可能性があります
  • arrayがクラスメンバーであり、配列とクラスへのポインタを指定した場合move、ポインタは移動後のオブジェクトを参照するようになります。オブジェクトも破棄された場合は、ランダムメモリを参照します。いずれにせよ、悪い。
于 2013-03-09T18:20:42.553 に答える
3

GCCにはC++の拡張機能があり、コンパイル時定数値ではないint array[n]場所を許可します。n標準言語では、このような場合に非定数値を使用することはできませんn(C99で許可されています)。

于 2013-03-09T18:20:26.437 に答える
3

私があなたの質問を正しく理解していれば、私は両方に答えることができます。

  1. int array[10]はスタックに割り当てられますint *array = new int[10]が、はヒープに割り当てられます。通常、スタック配列は一定数の要素でのみ機能するためint array[n]、C90では許可されていません(一定でない限りn)。

  2. MinGW(コードブロックがWindowsで使用するGCCコンパイラのバージョン)には、定数int array[n]ではないC90モードでの書き込みを可能にする拡張機能があります。nVisualC++ではこれは許可されていません。

于 2013-03-09T18:22:24.383 に答える
2

を書くときint array[n]、それはあなたが静的な割り当てを実行していることを意味します。つまり、メモリはコンパイル時に割り当てられます。したがって、ここで可変長を使用すると、コンパイル時エラーが発生します。

于 2013-03-09T18:24:16.297 に答える