stack overflowが発生した時の対策。

対策

以下のいずれか。

  1. でかいメソッドだったら分割する。
  2. 最後まで使わないメンバ変数は中括弧で括って途中で破棄させる。
  3. でかいメンバ変数は、newで宣言する。
  4. でかい配列は、std::vectorにする。
  5. スタック領域を拡張する(非推奨)

原因

メンバ変数は、スタック領域に確保される。
スタック領域が一杯なのに、さらに領域を確保しようとして溢れるのが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が返される。
  • ヒープ領域よりスタック領域の方が貴重。→参考

そんな感じ。