電子書籍の厳選無料作品が豊富!

私はVC++6.0で画像処理のプログラムを作っています。
再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。

これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。

なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

A 回答 (5件)

実際の実行時の再帰の段数は調べました?


あまり深いようなら、論理の再設計したほうが性能面での改善も得られ、一石二鳥かと。

浅い段数で潰れるなら、auto変数から static変数やHeap領域への転換を評価してみては?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

再帰の段数については、結構浅い段階で潰れているようなのですが、
知識がないもので、

>auto変数から static変数やHeap領域への転換を評価してみては?

の意味がよくわかりません。よろしかったら、教えてください。

お礼日時:2003/09/11 11:34

浅い段階で潰れる==再帰ごとのスタック成長幅が大きい



ってことですよね。この主な原因はスタックに積まれるauto変数(普通の変数)です。このauto変数に対して、static宣言した変数 や new,malloc()で確保したHeap領域上の変数はスタックを成長させません。

実際には両者の複合でstaticなポインタにHeap領域上の変数を割り当てて置き、再帰を抜けたら廃棄、なんてのが多いかも。

この回答への補足

たびたび申し訳ないのですが、スタックに積まれる変数というのは、
再帰呼び出しをする関数に渡す引数のことですよね?
また、

>実際には両者の複合でstaticなポインタにHeap領域上の
>変数を割り当てて置き、

この意味は、例えば

static int *a = new int;

ということですか?

補足日時:2003/09/12 11:57
    • good
    • 0
この回答へのお礼

2回目の回答ありがとうございます。

意味がわかりました。わざわざ答えていただきありがとうございます。

早速試してみます。

お礼日時:2003/09/12 10:38

もしかして、DLL作ってませんか?



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

この回答への補足

ご回答ありがとうございます。

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

補足日時:2003/09/05 17:43
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

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

コミットって何なのでしょうか?

お礼日時:2003/09/04 08:56

 スタックサイズを変更するのは簡単ですが、まずはそのプログラムがどうしてオーバーフローするのかを解析する必要があります。


 どんなに大きくしても症状が治まらないのなら、それは無限ループにハマってしまってるんです。

 それが既存のライブラリで、他のプログラムでは正常に動いているのであれば、使い方を間違っています。
 ご自分で作られたのであれば、全体を見直して、バグの箇所を間違っているところを特定しましょう。

 膨大な量のスタックを使用することが予め分かっているなら別ですが、そうでなければ、これを修正しないことには、危なくてしょうがないです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
自分のプログラムでは膨大な量のスタックを利用することが予め分かっています。

しかし、バグの可能性も否定できないので、一応調べてみます。
ありがとうございました。

お礼日時:2003/09/04 08:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!