スタックオーバーフロー例外が何であるか正確にはわかりません。別の形でメソッドを呼び出すと、このエラーが出ます。スタックオーバーフロー例外を定義してください - C#
答えて
プログラムが誤動作することがあります。プログラマは、ロジックを実装し、それが正しく動作することをテストすることによって、プログラムを記述します。しかし、プログラマがロジックを間違えた場合、悪いことが起こる可能性があります。
おそらく、プログラムが失敗する可能性のある最も一般的な方法の1つは、無限ループです。
static int Sum(int n)
{
int sum = 0;
int i = 1;
while (i <= n)
sum += i;
return sum;
}
どうなります:最初ののn整数を追加しようとすると、このサンプルプログラムを取りますか?バグはどこですか? i
をインクリメントするのを忘れてしまい、n
を超えることはありません。これを実行すると実行され、ハングします。それは決してそれ自身で止まらないでしょう。
しかし、プログラム内に無限ループがあり、そのループにのリソースを使用すると、リソースが不足する可能性があります。再帰を使って和を求める別のプログラムを考えてみましょう:
static int RecursiveSum(int n)
{
return n + RecursiveSum(n - 1);
}
このメソッドもバグです。終了条件を含めるのを忘れてしまったので、「無限ループ」もあります。実行するとどうなりますか?
処理は、StackOverflowExceptionのために終了します。
C#では、メソッドを呼び出すたびにスタックと呼ばれるリソースを少し使います。スタックは、プログラムが誰が誰を呼び出したかを記録しておくことができるので、メソッドが返ってきたときに正しい場所に戻ります。メソッド引数とローカル変数もスタック領域を使います。メソッドが終了して戻るとき、それらは使用したスタックスペースを解放します。
スタックはメモリを使用しているため、時間のような無限のリソースではありません。
だから、プログラムが生成できる2つの主要な方法がありますStackOverflowException
:
- あまりにも多くの再帰呼び出しレベルの
- シリーズを返すことはありませんメソッドを呼び出すメソッドを呼び出す方法の無限ループというを希望最終的には終わりですが、最初にスタックがなくなってしまいます。
最初の問題は上記の2番目の方法で示されています。しかし、終了条件を追加するためにその方法を修正しても、小さな数値に対しては機能しますが、nという十分大きな値の合計を生成する前に、最終的には失敗します。
ほとんどの園芸品種StackOverflowException
は最初のタイプですが、再帰を慎重に使用しないと、2番目の問題にも対処できます。
StackOverflowException
をデバッグするときにコールスタックは、多くの場合、次のようになります。C
を呼び出してから、再度A
を呼び出し
...
Program.RecursiveSum(int n = -7770) Line 26 + 0xf bytes C#
Program.RecursiveSum(int n = -7769) Line 26 + 0xf bytes C#
Program.RecursiveSum(int n = -7768) Line 26 + 0xf bytes C#
Program.RecursiveSum(int n = -7767) Line 26 + 0xf bytes C#
Program.RecursiveSum(int n = -7766) Line 26 + 0xf bytes C#
The maximum number of stack frames supported by Visual Studio has been exceeded.
または時々A
通話B
などをあなただけのループを見つける必要があり、設定inのブレークポイントは、何が起こっているかを診断します。
もちろん、C#にテールコールエミッションコンパイラがあれば、この例ではスタックオーバーフローが発生しないかもしれません; p –
うわー...これは本当に助けになりました!ありがとう! –
stack overflowは、お互いを呼び出すメソッドが多すぎる場合に発生します。
あなたのコードが関数を呼び出すときはいつでも、ランタイムはその関数を呼び出したときにあなたがいたところの呼び出しスタック呼び出しスタックにエントリをプッシュします。関数が終了すると、ランタイムはスタックのntryをポップしてそこに戻ります。
このスタックがいっぱいになると、スタックのオーバーフローが発生します。
スタックオーバーフローは、スタック領域を使い果たしたときです。スタック領域は、通常、メソッド呼び出しによって消費されます。メソッド呼び出しでは、引数値がスタックにプッシュされます(メソッドがスタックからポップ/削除されたときに戻ります)。スタックオーバーフローが発生する最も一般的なケースは、何らかの再帰(自身を呼び出すメソッド)がある場合です。各メソッド呼び出しでは、スタックオーバーフローが発生したときまで、もう少しスタックスペースを消費します。
- 1. C#例外の間にキャストされるユーザー定義の例外?
- 2. 前にスタックオーバーフロー例外main()
- 3. ユーザー定義例外のログC#
- 4. 「マルチバイトセーフ」という用語を定義してください。
- 5. クイックソートとスタックオーバーフローの例外
- 6. PHPの例外は、説明してください
- 7. _DEBUGが定義されている場合、NDEBUGを定義しないでください。
- 8. この例を説明してくださいCコード
- 9. C標準でスタックオーバーフローの動作が定義されていますか?
- 10. LISPの定義を参照してください
- 11. "Completed"の定義を変更してください
- 12. Railsでコントローラーアクションの期待パラメーターを定義してください
- 13. ユーザ定義ドメインのURLを書き直してください
- 14. コアデータに関係タイプを定義してください
- 15. この例外を理解しないでください
- 16. Node.js - requireが定義されていない例外
- 17. 定義されていないオフセット:1-ラーベルエラー例外
- 18. 無限ループなしのスタックオーバーフロー例外
- 19. boolがmixed C/C++で定義されているか確認してください
- 20. 無効なキー例外を助けてください
- 21. nullポインタ例外を取得しておいてください、ソース
- 22. python:デコレータをクラスとして定義してクラスをデコレートしてください
- 23. カスタム例外。これは定義されていません
- 24. スレッド "main"の例外org.apache.axis2.AxisFault:jdl.helloworld.webservices.service.HelloWorldSkeleton#SayHelloを実装してください
- 25. タブローを定義する方法を教えてください
- 26. twitter-bootstrapを使用してbtn-groupの値を定義してください
- 27. スタックオーバーフロー例外 - なぜですか?
- 28. C++例外(VS2010)を使用してメモリ不足を防ぐ方法を教えてください。
- 29. C#コンボイロックを試してください
- 30. C#マウスイベントを押してください
いくつかのコードを投稿した方が良いでしょう。私たちが実際に行っていることを行うことができます。あなたの例外を修正するのに役立ちます。簡単に検索可能な用語を定義しません。 –