int a;
cin >> a;
int n[a];
Visual Studioを使用したとき、プログラムはコンパイルされず、エラーが報告されました。しかし、私がプログラムをコンパイルするためにターミナルを使用したときに問題がなくなりました。それはなぜそうですか?これは動的メモリ割り当てと見なされますか?これは動的メモリ割り当てと見なされますか?
int a;
cin >> a;
int n[a];
Visual Studioを使用したとき、プログラムはコンパイルされず、エラーが報告されました。しかし、私がプログラムをコンパイルするためにターミナルを使用したときに問題がなくなりました。それはなぜそうですか?これは動的メモリ割り当てと見なされますか?これは動的メモリ割り当てと見なされますか?
いいえこれは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によって解放されます)。
また、 'new'ではなく固定サイズで割り当てられた配列は、オブジェクトの破壊後になくなりますが、' new'でそれを割り当てると、その確保されたスペースをデストラクタを介して効率的に解放する必要があります。私が「固定」と言うのは、もしあなたが 'new'を使うとしても、そのサイズはどこかから来なければならないということです。それは技術的に固定サイズです。 –
これはg ++拡張です...これはC99から来た構文です。 – xinaiz