([dcl.array])Dフォーム
D1 [定数式 OPT] 属性指定子を有する宣言TDにおいて
ARの大きオプト -seq rayは一定でなければならない(または適切なイニシャライザで指定しない)。
しかし、コンパイラの開発者の中には、プログラマの便宜のために、C++でCコードをコンパイルする能力を維持するためにVLA(Variable Length Arrays)を使用することを選択した人がいます(CではVLAがC99標準から許可されています)彼らが世界を征服した後でしか学ぶことができません。
ベスト標準に準拠した解決策は、use a std::vector
です。割り当てのサイズをコンパイル時に知ることができない場合です。
int n;
if (cin>>n) // don't allocate unless n is valid
{
vector<int> arr(n);
// use arr
}
VLAが利用可能であっても、vector
は依然としてより安全な解決策です。 vector
はダイナミックストレージから割り当てられることが多く、自動ストレージよりもはるかに大きなデータストアであることが多く、割り当てに失敗すると例外がスローされます。ストレージには大きすぎる可変長配列の動作は定義されていないことが多く、スタック(自動ストレージの一般的な形式)がオーバーフローして、ミステリーバグが多発します。
生メモリをnew
で割り当てることは、追加の管理(ある時点で手作業で削除する必要があります)とブック管理(割り当てのサイズはポインタでは分かりません)の責任を取り除くので避けてください。プログラマも今やアドレスしなければならないかもしれないThe Rules of Three and Five.
VLAはC++標準に準拠していません。実際に必要なのは 'std :: vector arr(n);'です。 –
user0042