• ベストアンサー

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
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • 再帰関数を使うとき、ソフトウェアスタックはハードウェアスタックと比べてどれくらい遅い?

    再帰を使って関数を書こうと思うのですが、再帰する回数が不明なので、スタックオーバーフローを避けるためソフトウェアスタックを使おうと思っている者です。 ソフトウェアスタックはどれくらい遅いのでしょうか? どう実装すれば速度が改善されるのでしょうか?

  • VC6でコンパイルでスタックの領域を増やすには?

    初めて、VisualC++6.0で再帰を行うプログラムを書いているのですが、 スタックオーバースローなのか、突然プログラムが終了し、タスクバーにあった実行中のアプリが消えてなくなります。 原因がまだわからないのですが、スタックを増やす方法が知りたいのですが、どうすればよいのでしょうか? また、このように突然アプリが終了するので、どこが原因かわからないのですが、実行中に警告表示するような機能はありますか?

  • VC++でプログラムから現在のスタックサイズを得る方法

    Microsoft VC++でC/C++プログラム内部で現在のスタックサイズを得る方法がありましたらお願いします。 可能ならC/C++のコードで、無理ならインラインアセンブラでも構いません。 デバッグモード時にはスタックチェックしているので、 どこかに情報はあると思います。 目的は、やたらスタック浪費しているので、該当関数、メソッドを探すためです。 人が作った大きなプログラムなのでソースから探すのが大変なので・・。

  • VC++2008でインポートライブラリのスタティックリンクの設定

    VC++2008でインポートライブラリのスタティックリンクの設定 従来のVC++6.0ではプロジェクトのビルド時にインポートライブラリをスタティックリンクさせる場合 「プロジェクト」メニューから「設定」項目を選択し、「プロジェクトの設定」ウィンドウを表示させて、 「リンク」タブをクリックして表示されるページの「オブジェクト/ライブラリモジュール」欄の先頭に、 MyDll.lib(例)とスペースを1つ入力していました。末尾のスペースはMyDll.libとkernel32.libを区切るために必要でした。 これをVC++2008で実現するためにはどの様にしたらいいのですか? VC++2008の「プロジェクト」メニューを探しても「プロジェクトの設定」ウィンドウがありません。

  • 最大スタックサイズを大きくすることの影響は?

    再帰呼び出しを行うプログラムでスタックオーバーフローが発生するようになりました。 そこで最大スタックサイズを変更しようと考えていますが 最大スタックサイズを大きくすることで何か影響があることはあるのでしょうか? 他アプリ等に影響が出ないかを懸念しています。 ※最大スタックサイズは最大で16Mらしく、現在は1Mです。  特に影響がないのであれば最初から16Mにしておけば良いような気もして疑問に思っています。

  • 【VC++6.0(MFC)】スタックメモリサイズの変更方法

    いつも大変お世話になっております。 VC++初心者です。 スタックメモリサイズがデフォルトで1Mが設定されているようですが、 それを確認、及び、変更する方法を教えていただけませんでしょうか。 (具体的には、1.0Mから0.5Mにしたいです。) ちなみに、某サイトで 「プロジェクトのプロパティ→リンカ→システム→スタックのサイズの設定」 で変更可能であるとあったのですが、「プロジェクトのプロパティ」が何を指すのか分かりませんでした。 お手数ですが、よろしくお願いします。

  • VC++を始めるにあたって

    始めまして。今回会社でVC++でMFCアプリケーションのプログラミングの仕事をすることになりました。  現在の私のスペックです。  [0] 今年入社、毎日プログラムの学習をしてます。  [1] 経験したプログラム   [1-1] C 学生時代、授業で基礎のみ   [1-2] JAVA 同じく授業で基礎のみ   [1-3] VC# 10日で覚えるVC#.netと言う本で学習中    VC++自体始めてなので、関数や書き方も理解してなくて、何から勉強したらいいのか分かりません。 いい勉強方法があれば教えてください。 また参考になるHPや参考書もあれば教えてください。 以上です。お願いします。

  • VCでコマンドプロンプトを後から表示する

    VC++初心者なのですが、初めのプロジェクト設定でコンソールプログラムを設定しなければ、printfなどを表示させるプロンプトが表示できないのでしょうか?main関数がないことが原因であれば、どこに書き足してよいかわかりません。。どなたか教えてください。