3

以下のようなコードを書く必要がある場合:

int a[10000000];

スタック オーバーフローが原因でコードが失敗する場合があることはわかっています。問題は、実行時にそのようなエラーを処理し、segfault を回避する方法です。

4

2 に答える 2

6

一般に、スタック オーバーフロー例外は適切な方法で処理するのが非常に困難です。これは、スタックが既にオーバーフローしているためです。さらに多くのコード (例外処理コードであっても) を実行するには、利用可能なスタック スペースが必要です。

一般に、プログラマーは、スタックをオーバーフローしないようにプログラムを設計します。これには以下が含まれます。

  • スタックに割り当てられる自動変数のサイズを最小限に保つ (大きなデータ構造が必要な場合は、他のタイプの割り当てを使用する)
  • 不必要な再帰を回避し、再帰が使用される場合は、最大深度に合理的な制約があることを確認します

関数内に 1,000 万個の整数用のスペースが必要な場合は、スタックに割り当てないでください - malloc()orを使用して割り当てnewます (実際に C を使用しているか C++ を使用しているかによって異なります)。もちろん、あなたがそれを終えたとき、それはあなたの責任でもありfree()ますdelete.

本当に C++ [1]を使用している場合は、おそらくstd::vector代わりに次を使用する必要があります。

std::vector a(10000000);

基礎となる標準ライブラリの実装は、フリー ストアにスペースを割り当て、関数が戻るときに自動的に割り当てを解除します。

[1]綴りが似ているという理由だけで、質問にの両方のタグを付けないでほしい。

于 2012-11-29T03:28:21.577 に答える
2

実行時にこれを処理する方法はありません。C で自動保存期間のオブジェクトを使用する唯一の正気で安全な方法は、それらを十分に小さくして、あなたが持っているとわかっているスタックの量を決して超えないようにすることです (たとえば、10% を超えて使用したり、あなたが期待しているもののように)。

于 2012-11-29T03:28:20.557 に答える