以下のようなコードを書く必要がある場合:
int a[10000000];
スタック オーバーフローが原因でコードが失敗する場合があることはわかっています。問題は、実行時にそのようなエラーを処理し、segfault を回避する方法です。
以下のようなコードを書く必要がある場合:
int a[10000000];
スタック オーバーフローが原因でコードが失敗する場合があることはわかっています。問題は、実行時にそのようなエラーを処理し、segfault を回避する方法です。
一般に、スタック オーバーフロー例外は適切な方法で処理するのが非常に困難です。これは、スタックが既にオーバーフローしているためです。さらに多くのコード (例外処理コードであっても) を実行するには、利用可能なスタック スペースが必要です。
一般に、プログラマーは、スタックをオーバーフローしないようにプログラムを設計します。これには以下が含まれます。
関数内に 1,000 万個の整数用のスペースが必要な場合は、スタックに割り当てないでください - malloc()
orを使用して割り当てnew
ます (実際に C を使用しているか C++ を使用しているかによって異なります)。もちろん、あなたがそれを終えたとき、それはあなたの責任でもありfree()
ますdelete
.
本当に C++ [1]を使用している場合は、おそらくstd::vector
代わりに次を使用する必要があります。
std::vector a(10000000);
基礎となる標準ライブラリの実装は、フリー ストアにスペースを割り当て、関数が戻るときに自動的に割り当てを解除します。
実行時にこれを処理する方法はありません。C で自動保存期間のオブジェクトを使用する唯一の正気で安全な方法は、それらを十分に小さくして、あなたが持っているとわかっているスタックの量を決して超えないようにすることです (たとえば、10% を超えて使用したり、あなたが期待しているもののように)。