1

サンプルコード:

Static void main(string[] args) { Class1 c1 = new Class1(); }

Class1 { Class1() { Class2 c2 = new Class2(); } }

Class2 { Class2() { Class1 c1 = new Class1(); } }

上記のコードは をスローしStackOverFlowExceptionます。ここではClass1&Class2オブジェクトを再帰的に作成しています。オブジェクトはヒープに格納されますが、なぜそれがスローされないか、ヒープにHeapOversizedException関連someotherExceptionしていないのですか?

4

2 に答える 2

8

無限再帰は常に を引き起こしStackOverflowExceptionます。これは、オブジェクトの割り当てが原因ではなく、メソッドの呼び出しがスタック上の呼び出し元のアドレスを記憶する必要があり、それを行うとスタックが無限にオーバーフローするためです。

ウィキペディアには、そのプロセスの非常に正式な説明があります。

于 2013-10-11T09:44:17.107 に答える
3

StackOverflowException - 現在のアドレスを格納し、関数コードにジャンプして実行するためにスタックが使用されます。その後、関数が戻るときに解放またはポップされます。あなたの呼び出しは決して終了したり戻ったりすることはないので、継続的にスタックはアドレスでいっぱいになり、いっぱいになりました。

于 2013-10-11T09:43:52.560 に答える