- ベストアンサー
変数の宣言場所について
<環境> WIN98 VC++6.0 MFC ダイアログベースにて 変数の宣言をグローバルにするとコンパイルはOKですが、 実行時にダウンしてしまいます。 グローバルに変えるだけでこのようなことがどうして起きるのでしょうか? CBitmap m_p[2];//エラー void CxxxDlg::OnPaint() { CBitmap m_p[2];//OK
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
グローバルに変える 'だけ' でダウンすることはまずありません。 グローバル変数とすることでデストラクタが動かなくなり、その結果メモリ/リソースが解放されずに溜まりつづけて…といったことが考えられます。いずれにせよコード中に何らかの誤りがあると考えられますし、そもそもグローバル変数の使用は極力控えるべきです。
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
デストラクタが動かなくなったので、ローカル変数であれば自動的に呼ばれていたDeleteObject()がなされていないことになるはずです。 # "グローバル変数とすることでデストラクタが動かなくなり..." って書いたのに… # 理解していただけなかったのでしょうか?
お礼
回答ありがとうございます。 >デストラクタが動かなくなったので、ローカル変数であれば自動的に呼ばれていたDeleteObject()がなされていないことになるはずです。 先回の回答にこんな深い意味があるとは思いませんでした。 言われている意味は分かりますが、今回の内容がそれにあたるかは判りません。 #いろいろ調べた結果、エラーの出る条件が明確になりましたが、質問のタイトルと内容が異なるため新規に質問したいと思います。
- ranx
- ベストアンサー率24% (357/1463)
No.1さんの回答に加えて、 変数のメモリー上での配置が変わることにより、 初期化されていないポインタの指し示す先等が 変わることがあります。このような場合、 グローバル変数を内部変数に変えてエラーが 起きなくなったとしても、問題は潜在的に 残っていると考えるべきです。何かのきっかけで 再び顕在化することもありますから。
お礼
回答ありがとう御座います。 #1のお礼欄についてもアドバイスあればお願いします。
お礼
回答ありがとう御座います。 エラーが出るコードを調べたら以下の場所でした。 何か気付かれたことがあればアドバイスお願いします 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); //ここでエラーが出る >グローバル変数の使用は極力控えるべきです。 以前教えていただいたので使う気はありませんが、今回は別の問題の調査用で一時的に使っています。
補足
あくまでも追加情報です。 void CxxxDlg::OnTimer(UINT nIDEvent) { n=n+1; if(n>=2){ n=0; } //Invalidate(); //これをコメントアウトするとダウンしない CDialog::OnTimer(nIDEvent); }