>最初から public にしておいた方がいいものもあるので。
それはもちろんそうですよね。
ちょっとおおざっぱに書いちゃいましたが・・
定義するときに、まぁこいつは他クラスからアクセスすることはないだろうって思った
変数は全てprivateで定義するべきだということを言いたかったのです。
>そのクラス自体がスタック上に確保されると
これは、他クラスでそのクラスのインスタンスを定義したときのみ起きる現象ですよ
ね?
今回の、LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; は、定義しているだけで
同クラス内でもアクセスしていません。
このクラスのインスタンスを他クラスでは定義してないのですが・・・
だから、自分はスタックにこの変数が確保されることはないと思ってるんですが・・・
間違ってますか?
> >そのクラス自体がスタック上に確保されると
> これは、他クラスでそのクラスのインスタンスを定義したときのみ起きる現象ですよね?
いいえ。他クラスに限りません。自動変数などでも発生します。
そして、そのメンバを持っているのが、仮に CXxxxDlg だとすれば、VCのスケルトンコードの
InitInstance の中で自動変数にとられてますから、ここでスタックオーバフローするでしょう。
> 今回の、LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; は、定義しているだけで
具体的に m_FileLog が定義されているクラスはなんですか。定義を開示してください。
> 同クラス内でもアクセスしていません。
定義された時点で問題となりますので、アクセスの有無とは無関係です。
> このクラスのインスタンスを他クラスでは定義してないのですが・・・
> だから、自分はスタックにこの変数が確保されることはないと思ってるんですが・・・
> 間違ってますか?
間違っています。
前述のように、他クラスで定義しなくても、そのクラス自身が自動変数として確保されれば、
その領域はスタックに確保されます。
>具体的に m_FileLog が定義されているクラスはなんですか。定義を開示してくださ
い。
CXxxxDlgです。
>そして、そのメンバを持っているのが、仮に CXxxxDlg だとすれば、VCのスケルトン
>コードのInitInstance の中で自動変数にとられてますから、ここでスタックオーバフ
>ローするでしょう。
これは知らなかったです。
言い換えてまとめると、
クラスCXxxxDlgで定義した、メンバ変数、メンバ関数は全てInitInstance()内で自動変
数となり、スタック領域に確保される。
だから、1Mを超える領域を定義するとスタックオーバーフローで死ぬ。
メンバ変数、メンバ関数をstaticで定義すると、
スタック領域には確保されず、静的記憶領域に確保されるのでOK!
ということですね?
そもそも質問から考えて、staticにすべきではないと思います
staticに場合はどんなときかを考えないと・・・
で、少なくとも今回の質問の回答からすると、スタックに取れない(取るべきでもないか
な)データだと思われるので、newすべきだと思います
どーーーしても、スタックにとりたいなら、スタックサイズを変更することもできます
が、KENBOさんの今回の解決方法としてはよろしくないですね
それから、変数のpublic定義など、ここ数年のやったことがありません
publicにする理由に出会ったことがありません
VC++のClassWizardでメンバ変数の追加するとpublicにあります
何でかとっても悩んでしまいます・・・
>定義するときに、まぁこいつは他クラスからアクセスすることはないだろうって思った
>変数は全てprivateで定義するべきだということを言いたかったのです。
他から勝手にアクセス出来ては困る変数→private or protected
他からアクセスする必要のない変数→private or protected
他からアクセスする必要のある変数→public
>クラスCXxxxDlgで定義した、メンバ変数、メンバ関数は全てInitInstance()内で自動変
数となり、スタック領域に確保される。
メンバ関数はstaticの有無に関わらず、普通はスタック領域には置かれません。
普通の関数と同じようにプログラム領域に置かれます。
メンバ変数が直接自動変数になるわけではありません。(似たようなものですが・・)
>どーーーしても、スタックにとりたいなら
そんなことはありません。
現時点で他の方法がわからないだけです。
>少なくとも今回の質問の回答からすると、スタックに取れない(取るべきでもないか
>な)データだと思われるので、newすべきだと思います
newで動的領域確保のほうがよいということですか!?
その場合って、コンストラクタ/デストラクタというのを用いるのですか?
そうすれば、メンバ変数と同様の扱いができるのですか?
コンストラクタ/デストラクタを使ったことない(使い方を知らない)のですが・・・
例えば、CxxxDlgというクラスなら、
CxxxDlg.hで、
class CxxxDlg : public CDialog
{
// 構築
private:
LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; // 一番上の定義
LOG_INFO *mp_buf;
CxxxDlg();
~CxxxDlg();
}
として、
CxxxDlg.cppで、
void CxxxDlg::CxxxDlg()
{
mp_buf = new LOG_INFO[MAX_LOG_DATA_NUM];
}
void CxxxDlg::~CxxxDlg()
{
delate[] mp_buf;
}
と実体を作る。
こんな使い方になりますか?
上記、
private:
> LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; // 一番上の定義
削除です。間違えました。
> 削除です。間違えました。
これを込みで、イメージはそうですね。
ダイアログベースで CDialog の派生なら用法的に大丈夫かもしれませんが、
自分でポインタをもつと、本来
CxxxDlg::CxxxDlg(const CxxxDlg&)//コピーコンストラクタ
CxxxDlg::operator =(const CxxxDlg&)//コピー演算子
とか考慮する必要があります。
なので、REE さんが既に書かれているように、std::vector<LOG_INFO>という方が
正攻法かもしれません。(これだと、副作用で(?)ログ数を可変長で保持できます。
>std::vector<LOG_INFO>という方が正攻法かもしれません。
これは、いったい何者ですか?
使い方がまったくわかりません。
また、ドコで使えばいいですか?
std::vectorは動的配列を扱えるクラスです。(可変長配列みたいなもの)
一度Google等の検索エンジンで探してみるとサンプルがゴロゴロとあります。
MFCならば、REEさんもおっしゃっていましたが、CArrayというクラスがあります。
こちらもGoogle等で探してみてください。
> 使い方がまったくわかりません。
簡単な使い方を説明したサイトです。参考にどうぞ。
http://www1.kcn.ne.jp/~robe/cpphtml/html04/cpp04005.html
でも、私の場合、MFCであれば CArray を使いますね。
(一部だけSTLを使うと気持ちが悪いので)
CArrayも使ったことないので
調べてやってみます。
ありがとうございます。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050043.txt
に続きのスレをたてました。
【プログラムが死ぬ・・・】原因は理解したので
このスレは解決とします。
ありがとうございました。