2017-02-19 8 views
3
int a; 
cin >> a; 
int n[a]; 

Visual Studioを使用したとき、プログラムはコンパイルされず、エラーが報告されました。しかし、私がプログラムをコンパイルするためにターミナルを使用したときに問題がなくなりました。それはなぜそうですか?これは動的メモリ割り当てと見なされますか?これは動的メモリ割り当てと見なされますか?

+1

これはg ++拡張です...これはC99から来た構文です。 – xinaiz

答えて

10

いいえこれはC++11またはC++14では無効です。 variable length arrayという拡張子を使用しています(すべてではないコンパイラがあります)。

また、VLAは巨大なアレイではうまく機能しません。数百万のコンポーネントで - 実際にあなたのcall stack

Dynamic memory allocation(メガバイトまたはそれらのいくつかに、例えば)限られているので、内部new(またはmalloc)のようなものを使用しています。これは、プロセスのvirtual address spaceを変更します(system callsは、Linuxではmmapと呼ばれますが、Windowsではnewと呼ばれることもあります)。

ダイナミックメモリを使用するには、std::vectorのように、standard containerを使用するのが適切です(標準適合)。そのデータはヒープに割り当てられます(ベクトルのdestructorによって解放されます)。

+0

また、 'new'ではなく固定サイズで割り当てられた配列は、オブジェクトの破壊後になくなりますが、' new'でそれを割り当てると、その確保されたスペースをデストラクタを介して効率的に解放する必要があります。私が「固定」と言うのは、もしあなたが 'new'を使うとしても、そのサイズはどこかから来なければならないということです。それは技術的に固定サイズです。 –

関連する問題