2009-03-25 4 views
0

自分自身を再帰的に無限に呼び出す関数があります。無限再帰中に関数がスタック空間を使い果たすとどうなりますか?

この関数にはいくつかの引数もあります。

すべての関数呼び出しでは、引数と戻りアドレスがスタックにプッシュされます。

各プロセスには、ヒープのように動的に拡張できない固定サイズのスタック領域があります。 そして、私は各スレッドも独自のスタックを持っていると思います。

ここで関数が無限に再帰的に呼び出され、プロセスのスタック領域が不足すると、どうなりますか?

プログラムはクラッシュしますか? OSは状況を処理しますか? 4GBのアドレス空間があるので、OSはスタックサイズを増やすために何もできません。

+0

私はそれがかわいいと思った。 ++ – guns

答えて

6

stack overflow.

プロセスUNIXでは、互換性がSIGSEGVまたはSIGSTKFLT信号を投げて終了してしまいます。

Windowsでは、例外をスローする例外処理STATUS_STACK_OVERFLOWが終了します。

+0

LOL、タイトルから、私はこの質問が冗談だと​​思った。 – harpo

+0

私はまさに;-) stackoverflowのスタックオーバーフローを求めて;-) – vartec

+0

キリストは、タイトルに... – annakata

-1

プログラムがクラッシュします。通常、スタックは、使用可能なすべてのメモリを消費する前に、このようなバグをトラップするためにオペレーティングシステムによって制限されています。 Linuxでは少なくともシェルのlimitコマンドを発行すれば、スタックサイズを変更することができます。

+0

私はあなたの答えを落とした人ではありませんでしたが、(少なくともx86では)スタックポインタがプロセスに割り当てられたページを指し続ける限り、カーネルがスタック領域を使い果たすプログラムを検出する方法はありません。 –

+0

しかし、それはできることを正確に指摘しました。スタックはメモリページにマップされ、スタック制限では保護された(書き込まれない)ページがあります。 –

1

少なくともC++の場合、「未定義の動作」の領域になります.Twilightゾーンのようなものですが、何かが起こる可能性があります。

再帰が無限大の場合、スタックのサイズを増やすとどんな利点がありますか?早い段階で失敗する方が良い。

+0

そして細かい点を置くこと。メモリが限られているマシンでは、無限の再帰などはありません。その再帰の基本ケースは、たまたまスタックオーバーフローになります。 =) – JohnFx

0

典型的なUnix結果はセグメンテーション違反になります。 Windowsについて知りません。

0

どうなりますか?

あなたが頼りにするべきことはありません。

アルゴリズムが終了していることを確認してください。それはここで唯一のポータブルなアドバイスです。

+0

は間違いなく同意します。アルゴリズムが終了しない場合、有効なアルゴリズムではありません。 – SirDemon

+0

私は実際にこれにdownvotesを受け取りますか?はい、vartecの答えがよかったです。しかし、スタック保護なしのマシンがあります。したがって、正解は「行動は未定義」です。世界はWindowsとLinuxよりも大きい... – DevSolar

1

言語によっては例外が発生する(Javaなど)か、プログラムがクラッシュする(C、C++)。

通常、スタックは比較的小さく、これで十分であり、スタックオーバーフローがエラーを通知するためです。 Javaでは、必要であればコマンドラインオプションでスタック領域を増やすことができます。

また、関数型言語は通常、末尾再帰をループにコンパイルします。この場合、スタックスペースは使用されません。

0

はい、プログラムがクラッシュします。バグのあるコードが(すでに行っている)他のプロセスを傷つけないようにすること以外に、OSが "状況を処理する"方法はありません。OSはあなたが何であるかを知る方法がありません実際にはは、あなたが言ったことではなく、あなたのプログラムがやりたいと思っていました。

2

これは言語に依存しない - 言語/プラットフォームに大きく依存します。

C#(または任意の.NET言語)では、StackOverflowExceptionが取得されます。これは.NET 2.0では検出されず、プロセスが停止します。

Java(または任意のJVM言語)では、StackOverflowErrorspecified here)が表示されます。

私は他の言語やプラットフォームに対処するための他の回答にそれを残しておきます:)

0

あり何が起こるだろう答えの多くがありますが、私は非常に簡単な解決策に言及したい:ちょうどで

をチューリングマシンとあなたのコードを実行することができます。それは十分なスペースを持っています。

関連する問題