stack overflowが発生した時の対策。
対策
以下のいずれか。
- でかいメソッドだったら分割する。
- 最後まで使わないメンバ変数は中括弧で括って途中で破棄させる。
- でかいメンバ変数は、newで宣言する。
- でかい配列は、std::vectorにする。
- スタック領域を拡張する(非推奨)
原因
メンバ変数は、スタック領域に確保される。
スタック領域が一杯なのに、さらに領域を確保しようとして溢れるのがstack overfllow。
詳細
1,2は、スタック領域を節約することで回避する方法。
中括弧で括ると、その中のメンバ変数は中括弧を出るときに解放される。
例:
{ TestClass b; } // ここでbは解放される。 b->test(); // bは既に無い為、コンパイルエラー
3,4は、別の領域に確保する方法。
newやmallocした場合は、ヒープ領域に内容が格納される。
std::vectorもヒープ領域に内容が格納される上、領域が動的に確保されるから便利。
5は、スタック領域を拡張する方法。→VCでのやり方
蛇足
- ヒープ領域の確保に失敗した場合は、std::bad_allocがthrowされる。
- new (std::nothrow) ならば、Exceptionが発生せず、0x00が返される。
- ヒープ領域よりスタック領域の方が貴重。→参考
そんな感じ。