プログラムが死ぬ・・・ – 固定ページ 2 – プログラミング – Home

プログラムが死ぬ・・・
 
通知
すべてクリア

[解決済] プログラムが死ぬ・・・

固定ページ 2 / 2

KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

>最初から public にしておいた方がいいものもあるので。
それはもちろんそうですよね。
ちょっとおおざっぱに書いちゃいましたが・・
定義するときに、まぁこいつは他クラスからアクセスすることはないだろうって思った
変数は全てprivateで定義するべきだということを言いたかったのです。

>そのクラス自体がスタック上に確保されると
これは、他クラスでそのクラスのインスタンスを定義したときのみ起きる現象ですよ
ね?
今回の、LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; は、定義しているだけで
同クラス内でもアクセスしていません。
このクラスのインスタンスを他クラスでは定義してないのですが・・・
だから、自分はスタックにこの変数が確保されることはないと思ってるんですが・・・
間違ってますか?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> >そのクラス自体がスタック上に確保されると
> これは、他クラスでそのクラスのインスタンスを定義したときのみ起きる現象ですよね?

いいえ。他クラスに限りません。自動変数などでも発生します。

そして、そのメンバを持っているのが、仮に CXxxxDlg だとすれば、VCのスケルトンコードの
InitInstance の中で自動変数にとられてますから、ここでスタックオーバフローするでしょう。

> 今回の、LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; は、定義しているだけで

具体的に m_FileLog が定義されているクラスはなんですか。定義を開示してください。

> 同クラス内でもアクセスしていません。

定義された時点で問題となりますので、アクセスの有無とは無関係です。

> このクラスのインスタンスを他クラスでは定義してないのですが・・・
> だから、自分はスタックにこの変数が確保されることはないと思ってるんですが・・・
> 間違ってますか?

間違っています。
前述のように、他クラスで定義しなくても、そのクラス自身が自動変数として確保されれば、
その領域はスタックに確保されます。


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

>具体的に m_FileLog が定義されているクラスはなんですか。定義を開示してくださ
い。
CXxxxDlgです。

>そして、そのメンバを持っているのが、仮に CXxxxDlg だとすれば、VCのスケルトン
>コードのInitInstance の中で自動変数にとられてますから、ここでスタックオーバフ
>ローするでしょう。
これは知らなかったです。

言い換えてまとめると、

クラスCXxxxDlgで定義した、メンバ変数、メンバ関数は全てInitInstance()内で自動変
数となり、スタック領域に確保される。
だから、1Mを超える領域を定義するとスタックオーバーフローで死ぬ。
メンバ変数、メンバ関数をstaticで定義すると、
スタック領域には確保されず、静的記憶領域に確保されるのでOK!

ということですね?


返信引用
え~いち
 え~いち
(@え~いち)
ゲスト
結合: 19年前
投稿: 78
 

そもそも質問から考えて、staticにすべきではないと思います
staticに場合はどんなときかを考えないと・・・
で、少なくとも今回の質問の回答からすると、スタックに取れない(取るべきでもないか
な)データだと思われるので、newすべきだと思います
どーーーしても、スタックにとりたいなら、スタックサイズを変更することもできます
が、KENBOさんの今回の解決方法としてはよろしくないですね

それから、変数のpublic定義など、ここ数年のやったことがありません
publicにする理由に出会ったことがありません
VC++のClassWizardでメンバ変数の追加するとpublicにあります
何でかとっても悩んでしまいます・・・


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

>定義するときに、まぁこいつは他クラスからアクセスすることはないだろうって思った
>変数は全てprivateで定義するべきだということを言いたかったのです。

他から勝手にアクセス出来ては困る変数→private or protected
他からアクセスする必要のない変数→private or protected
他からアクセスする必要のある変数→public

>クラスCXxxxDlgで定義した、メンバ変数、メンバ関数は全てInitInstance()内で自動変
数となり、スタック領域に確保される。

メンバ関数はstaticの有無に関わらず、普通はスタック領域には置かれません。
普通の関数と同じようにプログラム領域に置かれます。

メンバ変数が直接自動変数になるわけではありません。(似たようなものですが・・)


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

>どーーーしても、スタックにとりたいなら
そんなことはありません。
現時点で他の方法がわからないだけです。

>少なくとも今回の質問の回答からすると、スタックに取れない(取るべきでもないか
>な)データだと思われるので、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;
}
と実体を作る。

こんな使い方になりますか?


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

上記、
private:
> LOG_INFO m_FileLog[MAX_LOG_DATA_NUM]; // 一番上の定義
削除です。間違えました。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 削除です。間違えました。
これを込みで、イメージはそうですね。

ダイアログベースで CDialog の派生なら用法的に大丈夫かもしれませんが、
自分でポインタをもつと、本来
CxxxDlg::CxxxDlg(const CxxxDlg&)//コピーコンストラクタ
CxxxDlg::operator =(const CxxxDlg&)//コピー演算子
とか考慮する必要があります。

なので、REE さんが既に書かれているように、std::vector<LOG_INFO>という方が
正攻法かもしれません。(これだと、副作用で(?)ログ数を可変長で保持できます。


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

>std::vector<LOG_INFO>という方が正攻法かもしれません。
これは、いったい何者ですか?
使い方がまったくわかりません。
また、ドコで使えばいいですか?


返信引用
「使用上の注意」を必ずお読み下さい。
 「使用上の注意」を必ずお読み下さい。
(@「使用上の注意」を必ずお読み下さい。)
ゲスト
結合: 19年前
投稿: 1
 

std::vectorは動的配列を扱えるクラスです。(可変長配列みたいなもの)
一度Google等の検索エンジンで探してみるとサンプルがゴロゴロとあります。

MFCならば、REEさんもおっしゃっていましたが、CArrayというクラスがあります。
こちらもGoogle等で探してみてください。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 使い方がまったくわかりません。

簡単な使い方を説明したサイトです。参考にどうぞ。
http://www1.kcn.ne.jp/~robe/cpphtml/html04/cpp04005.html

でも、私の場合、MFCであれば CArray を使いますね。
(一部だけSTLを使うと気持ちが悪いので)


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

CArrayも使ったことないので
調べてやってみます。
ありがとうございます。


返信引用
KENBO
 KENBO
(@KENBO)
ゲスト
結合: 19年前
投稿: 55
Topic starter  

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050043.txt

に続きのスレをたてました。
【プログラムが死ぬ・・・】原因は理解したので
このスレは解決とします。
ありがとうございました。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました