プロが教える店舗&オフィスのセキュリティ対策術

<環境> WIN98 VC++6.0 MFC 
ダイアログベースにて
変数の宣言をグローバルにするとコンパイルはOKですが、
実行時にダウンしてしまいます。

グローバルに変えるだけでこのようなことがどうして起きるのでしょうか?


CBitmap m_p[2];//エラー

void CxxxDlg::OnPaint()
{
CBitmap m_p[2];//OK

A 回答 (3件)

グローバルに変える 'だけ' でダウンすることはまずありません。



グローバル変数とすることでデストラクタが動かなくなり、その結果メモリ/リソースが解放されずに溜まりつづけて…といったことが考えられます。いずれにせよコード中に何らかの誤りがあると考えられますし、そもそもグローバル変数の使用は極力控えるべきです。

この回答への補足

あくまでも追加情報です。

void CxxxDlg::OnTimer(UINT nIDEvent)
{

n=n+1;
if(n>=2){
n=0;
}

//Invalidate();  //これをコメントアウトするとダウンしない

CDialog::OnTimer(nIDEvent);
}

補足日時:2003/10/08 13:38
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。

エラーが出るコードを調べたら以下の場所でした。
何か気付かれたことがあればアドバイスお願いします


CBitmap m_p3[2];

void CxxxDlg::OnPaint()
{

CPaintDC dc(this); // 描画用のデバイス コンテキスト


CRgn *m_rTemp, *m_rPixel;
CDC tempDC;
POINT p;
COLORREF transpColor;

int x, y;

tempDC.CreateCompatibleDC(NULL);// DCを作成してビットマップを選択
m_p3[0].LoadBitmap(IDB_BITMAP1); //ここでエラーが出る


>グローバル変数の使用は極力控えるべきです。
以前教えていただいたので使う気はありませんが、今回は別の問題の調査用で一時的に使っています。

お礼日時:2003/10/08 13:19

デストラクタが動かなくなったので、ローカル変数であれば自動的に呼ばれていたDeleteObject()がなされていないことになるはずです。



# "グローバル変数とすることでデストラクタが動かなくなり..." って書いたのに…
# 理解していただけなかったのでしょうか?
    • good
    • 0
この回答へのお礼

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

>デストラクタが動かなくなったので、ローカル変数であれば自動的に呼ばれていたDeleteObject()がなされていないことになるはずです。

先回の回答にこんな深い意味があるとは思いませんでした。

言われている意味は分かりますが、今回の内容がそれにあたるかは判りません。

#いろいろ調べた結果、エラーの出る条件が明確になりましたが、質問のタイトルと内容が異なるため新規に質問したいと思います。

お礼日時:2003/10/09 20:18

No.1さんの回答に加えて、


変数のメモリー上での配置が変わることにより、
初期化されていないポインタの指し示す先等が
変わることがあります。このような場合、
グローバル変数を内部変数に変えてエラーが
起きなくなったとしても、問題は潜在的に
残っていると考えるべきです。何かのきっかけで
再び顕在化することもありますから。
    • good
    • 0
この回答へのお礼

回答ありがとう御座います。

#1のお礼欄についてもアドバイスあればお願いします。

お礼日時:2003/10/08 13:21

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