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

お世話になっています、fujitomoと申します。
現在、Visual C++のダイアログベースプログラムを作成しており、
メインダイアログから、各ダイアログ(計7つほど)にメッセージを送信したり、DoModal()で表示するために、メインダイアログのメンバ変数に各ダイアログのインスタンスを定義しました。
Ex)
CSampleAClass A;
CSampleBClass B;
このように、定義し、いざメインダイアログからダイアログを呼び出そうとしたときに以下のようなメッセージのエラーが表示されました。

Unhandled exception at 0x40042c10 in Sample.exe: 0xC00000FD: Stack overflow.

これはWindows CEのみのメッセージかもしれないのですが、たぶん言いたいことはスタックオーバーしてるよ、ということだと思います。
そこで、計7つのダイアログの定義を少なくして、6つにしたところ、上のエラーメッセージはでず、正常にダイアログが表示されました。

次にメンバ変数で各ダイアログのインスタンスを定義するのではなく、そのポインタを定義するようにプログラムを変更してみました。
Ex)
CSampleAClass* A;
CSampleBClass* B;
このようにすると、計7つのダイアログをメンバ変数に定義してもエラーが発生せずに、正常にダイアログを表示させることが出来ました。

この理由はなぜでしょうか?
C言語を始めて時間はたっているのですが、いまだにいまいちインスタンスのオブジェクトとそのポインタでの定義における違いがよく分かっていません。今回のことから、クラスをメンバ変数に定義するときはポインタで定義したほうがいいということなのでしょうか?

ご参考となる意見がございましたら、ご意見宜しくお願い致します。

尚、開発環境は
Windows CE 6.0
Visual Studio 2005
です。
宜しくお願い致します。

A 回答 (1件)

CSampleAClass A;


だとスタックに
CSampleAClass* A = new CSampleAClass();
だとヒープに
オブジェクトが作成されるからでしょう。
前者の場合、単純に6つのダイアログ作成がスタックの限界だったんだと思いますよ。
リンカのオプションでスタックサイズを変えることができるので、増やしてビルドしなおせば、元のコードでも7つのダイアログを扱うことができるはずです。
    • good
    • 0
この回答へのお礼

prophetok様、御回答ありがとうございます。
スタック、ヒープの違いがあったんですね。教えていただいてありがとう
ございました。
教えて頂いたとおり、リンカのオプションを見てみます。

お礼日時:2009/07/13 08:51

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