• ベストアンサー

VC++6.0 Stack Overflow !!

私はVC++6.0で画像処理のプログラムを作っています。 再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。 これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。 なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.4

実際の実行時の再帰の段数は調べました? あまり深いようなら、論理の再設計したほうが性能面での改善も得られ、一石二鳥かと。 浅い段数で潰れるなら、auto変数から static変数やHeap領域への転換を評価してみては?

mkmarimo
質問者

お礼

ご回答ありがとうございます。 再帰の段数については、結構浅い段階で潰れているようなのですが、 知識がないもので、 >auto変数から static変数やHeap領域への転換を評価してみては? の意味がよくわかりません。よろしかったら、教えてください。

その他の回答 (4)

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.5

浅い段階で潰れる==再帰ごとのスタック成長幅が大きい ってことですよね。この主な原因はスタックに積まれるauto変数(普通の変数)です。このauto変数に対して、static宣言した変数 や new,malloc()で確保したHeap領域上の変数はスタックを成長させません。 実際には両者の複合でstaticなポインタにHeap領域上の変数を割り当てて置き、再帰を抜けたら廃棄、なんてのが多いかも。

mkmarimo
質問者

お礼

2回目の回答ありがとうございます。 意味がわかりました。わざわざ答えていただきありがとうございます。 早速試してみます。

mkmarimo
質問者

補足

たびたび申し訳ないのですが、スタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですよね? また、 >実際には両者の複合でstaticなポインタにHeap領域上の >変数を割り当てて置き、 この意味は、例えば static int *a = new int; ということですか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

もしかして、DLL作ってませんか? 確かスタックサイズは呼び出し元のEXEから指定されるんで、DLLの設定を変えてもだめだったような・・・

mkmarimo
質問者

補足

ご回答ありがとうございます。 プロジェクトはEXEです。けど、DLLはスタックオーバーフローとは関係のないところで使ってます。 関係しているのでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

コミットのところに予約と同じ値を入れてもだめでした?

mkmarimo
質問者

お礼

ご回答ありがとうございます。 コミットのところに同じ値を入れてもダメでした。 コミットって何なのでしょうか?

noname#25358
noname#25358
回答No.1

 スタックサイズを変更するのは簡単ですが、まずはそのプログラムがどうしてオーバーフローするのかを解析する必要があります。  どんなに大きくしても症状が治まらないのなら、それは無限ループにハマってしまってるんです。  それが既存のライブラリで、他のプログラムでは正常に動いているのであれば、使い方を間違っています。  ご自分で作られたのであれば、全体を見直して、バグの箇所を間違っているところを特定しましょう。  膨大な量のスタックを使用することが予め分かっているなら別ですが、そうでなければ、これを修正しないことには、危なくてしょうがないです。

mkmarimo
質問者

お礼

ご回答ありがとうございます。 自分のプログラムでは膨大な量のスタックを利用することが予め分かっています。 しかし、バグの可能性も否定できないので、一応調べてみます。 ありがとうございました。