Unity - StackOverflowException が起こった場合の対処法 -
初めに
StackOverflowException と呼ばれるエラーが起きる原因と対処法についてまとめます。また、StackOverflowException と同時に TLS Allocator ALLOC_TEMP_THREAD とコンソールにエラーが表示されることがあります。この解決方法についてもまとめます。
Index
StackOverflowException とは
StackOverflow による例外エラーのことです。StackOverflowとは、Stack(入れ物)がある条件によって溢れ出てしまうことです。
エラーメッセージ
次のようなエラーメッセージがコンソールに表示されます。
StackOverflowException: The requested operation caused a stack overflow.
StackOverflow が起こる原因
再帰処理によって、起こることが多いようです。再帰処理とは自らの処理を呼び出す処理が行われることです。
(再帰処理の例)
void Start() { Method(); } private void Method() { Method(); }
上の例では、無限に Method という名前の関数が呼び出されます。このように、再帰処理で呼び出す関数が多すぎると、その結果、Stack が限界を超える、つまり Overflow します。
対処法
無限に関数を呼び出すような設計をしないようにしましょう。
下記スクリプトのような場合でも無限に関数を呼び出すため、StackOverflow が起きる場合があります。
void Start() { Method1(); } private void Method1() { Method2(); } private void Method2() { Method1(); }
TLS Allocator ALLOC_TEMP_THREAD とエラーの表示が出た場合
StackOverflowException が起こると同時に次のようなエラーメッセージが表示されることがあります。
Assertion failed: TLS Allocator ALLOC_TEMP_THREAD, underlying allocator ALLOC_TEMP_THREAD has unfreed allocations
次のようにすれば、解決します。
UnityメニューのAssets>Reimport ALL をクリック
※StackOverflowException を起こしていなくても次のような場面でこのエラーメッセージが表示されることがあるようです。
- iOS向けに構築する
- ビルド終了後コンソールを選択する
Unity 自体のバグなようです。おとなしく Reimport しましょう。
最後に
StackOverflowException は知らなければ、なぜエラーがでているのかわからないかもしれません。再帰処理を作る場合は、意識しておきましょう。