Tips

スタックに空きがありません

日付2007/07/23
ID07-012
バージョンAll
プラットフォームMac / Win

この記事は、最新ではないバージョンに関連した方法について解説しています。

最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。

4Dの実行中に「スタックに空きがありません(Not enough stack space)」と表示された時には、次の点を見直してください。

  1. 再帰呼出しルーチンが深い階層で行われた
  2. 入力(ACCEPT)またはキャンセル(CANCEL)されないフォームの連続した表示

再帰呼出しルーチンとは、メソッドの中で自分を直接あるいは間接的に呼び出すことです。例えばフォルダの中にあるフォルダを次々と探索していくようなメソッドを作成する時に、再帰呼出しはとても便利でかつ有効な方法です。しかし再帰呼出しの階層が深くなると、スタックと呼ばれるメモリ領域が不足し、表題のエラーが発生します。

同様にフォームの表示でもスタックメモリの消費は発生します。

一般的な4Dアプリケーションでは、リストフォームから詳細フォームが呼び出され表示されますが、このときスタックメモリを使います。詳細フォームで入力やキャンセルの動作が行われ、リストフォームに戻ると使用されたスタックメモリは解放されます。ところが入力やキャンセルの動作が行われずに、次々とフォームが表示されていくようなアプリケーションを作成すると、スタックメモリは解放されずに消費されます。例え新しいウィンドウを開いたとしても、同じプロセス(New process関数を使わない)時には、スタックメモリが消費されていくことになります。

このエラーが発生した原因が、必要不可欠な再帰呼出しによるものであるときには、New process関数を使ってスタックメモリを増やしたプロセスで動作させることで回避できます。しかし解放されないスタックが蓄積されることが原因のときには、いくらスタックメモリを大きく設定しても、やがてこのエラーに遭遇することになります。

このエラーが発生した時には、まずプログラムが適切に設計されているか見直すことが重要です。

参考資料: