スタック オーバーフローの処理は適切な解決策ではありません。代わりに、プログラムがスタックをオーバーフローしないようにする必要があります。
スタックに大きな変数を割り当てないでください (何が「大きい」かはプログラムによって異なります)。既知の最大深度の後に再帰アルゴリズムが終了することを確認します。再帰アルゴリズムが未知の回数または多数の回数再帰する可能性がある場合は、(独自の動的に割り当てられたスタックを維持することによって) 再帰を自分で管理するか、再帰アルゴリズムを同等の反復アルゴリズムに変換します。
「本当に堅牢」でなければならないプログラムは、「大量のスタックを消費する」サードパーティまたは外部のライブラリを使用しません。
一部のプラットフォームでは、スタック オーバーフローが発生したときにプログラムに通知し、プログラムがエラーを処理できるようにすることに注意してください。たとえば、Windows では例外がスローされます。この例外は C++ 例外ではありませんが、非同期例外です。C++ 例外はステートメントによってのみスローされるのthrow
に対し、非同期例外はプログラムの実行中にいつでもスローされる可能性があります。ただし、スタック オーバーフローはいつでも発生する可能性があるため、これは予期されることです。関数呼び出しまたはスタック割り当てがスタックをオーバーフローする可能性があります。
noexcept
問題は、スタック オーバーフローにより、例外をスローすることが想定されていないコード (たとえば、マークされた関数やthrow()
C++ の関数)からでも非同期例外がスローされる可能性があることです。したがって、この例外を何らかの方法で処理したとしても、プログラムが安全な状態にあることを知る方法はありません。したがって、非同期例外を処理する最善の方法は、まったく処理しないことです(*)。スローされた場合、プログラムにバグが含まれていることを意味します。
他のプラットフォームにもスタック オーバーフロー エラーを「処理」するための同様の方法がある場合がありますが、そのような方法はすべて同じ問題に悩まされる可能性があります。エラーを引き起こさないと予想されるコードがエラーを引き起こす可能性があります。
(*) 非常にまれな例外がいくつかあります。