回答:
ここでスタックオーバーフローが発生している可能性があります。配列が大きすぎて、プログラムのスタックアドレス空間に収まりません。
ヒープに配列を割り当てる場合は、マシンに十分なメモリがあると想定して、問題ないはずです。
int* array = new int[1000000];
ただし、これにdelete[]
は配列が必要になることを覚えておいてください。より良い解決策は、それを使用std::vector<int>
して1000000要素にサイズ変更することです。
CまたはC ++では、ローカルオブジェクトは通常スタックに割り当てられます。スタックが処理できる以上の大きな配列をスタックに割り当てているため、stackoverflowが発生しています。
スタック上でローカルに割り当てないでください。代わりに他の場所を使用してください。これは、オブジェクトをグローバルにするか、グローバルヒープに割り当てることによって実現できます。他のコンパイルユニットのを使用しない場合は、グローバル変数で問題ありません。これが誤って発生しないようにするには、静的ストレージ指定子を追加します。そうでない場合は、ヒープを使用します。
これにより、ヒープの一部であるBSSセグメントに割り当てられます。
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
これにより、ヒープの一部でもあるDATAセグメントに割り当てられます。
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
これにより、ヒープ内の指定されていない場所に割り当てられます。
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
割り当てる場所はどこでも良い習慣ですnew
。しかし、メモリを(mainのように)1回だけ割り当てることが確実である場合、それは厳密には必要ありません-明示的に指定しなくても、mainの出口でメモリが解放されることが保証されますdelete
。
また、ほとんどのUNIXおよびLinuxシステムで実行している場合は、次のコマンドで一時的にスタックサイズを増やすことができます。
ulimit -s unlimited
しかし、注意してください。メモリは限られたリソースであり、大きな力には大きな責任があります:)