質問

VC++6.0 MFCダイアログベースアプリを作成しているものです。

メインダイアログの他に別ダイアログを追加しようと思い、
新規にクラスを追加し、ダイアログを作成しました。
メインダイアログに終了ボタンがあり、押下することにより、
OnClose()を呼び、アプリを終了させています。
ここで、終了ボタンを押すと、以下のメッセージが表示されます。

ハンドルされていない例外は*****にあります。
0xC0000005: Access Violation

新規追加したクラス宣言部をコメントアウトすると、例外が発生しませんでした。

VC初心者でして、このエラーがメモリー関係では?とは想像がつくのですが、
どのようにアプリに影響しているのかがわかりません。
Access Violationが発生した時の対処法とかクラスを新規追加したことによる、
影響範囲がどの程度あるのか等、ご教授願えませんでしょうか?

よろしくお願い致します。

通報する

回答 (1件)

VC++のデバッガを使いましょう。
デバッグモードでビルドして、デバッグ-実行
してやればAccess Violationした位置でデバッガがブレークを掛けてくれるはずです。
その後、デバッガのスタックトレースウィンドウから呼び出し元をたどっていき、Access violationの原因となったコードを探しましょう。

#感じ的に初期化/確保されていないポインタ相手にアクセスしたっぽいですが・・・

また、Access Violationなどの場合、スタック破壊が起こっている場合もあります。そういう場合はブレークポイントをいくつか設定して、実行してAccess Violation位置を探しましょう。


>クラスの新規追加による影響
ちゃんと作られたプログラムに変なクラスを突っ込んだ場合は当然影響が出ます。
逆にちゃんと作られたクラスを追加した場合に問題が発生した場合、それまでのプログラムに表面化しなかった問題があった、というだけの事です。作ってる方も人間ですから完全なものは作れないですし・・・(^^;

>影響範囲
さまざまかと(^^;
C++例外でトラップしてやればAccess Violationもトラップしてやる事は出来ます(参考URLの17章参照)が、通常、起こった時点でアルゴリズム的に問題があると思います。

仕事などでやっている場合は
Purify(http://www.sra.co.jp/Rational/purify/purifyNT.ht …やBoundsChecker(http://www.numegajapan.com/products/vc.htm)などのプログラムチェッカを導入するのも手ですね。

#蛇足
OnClose()後に例外が発生するという事は終了処理回りに不備があるのでしょう。
確保したメモリを開放していなかったり、逆に既に開放しているメモリをもう一度開放しようとしていたり・・・
ある程度経験を積めば、メモリ周りのトラブルの対処(というよりトラブルを起こさないためのプログラムか)方法も身につくかと。
確かにこの辺のプログラムスタイルについての解説はあまり無いのも確かですが、まったく無いわけでもありません。

・Effective C++
・More Effective C++
・Writing Solidcode
・Code Complete

あたりが参考になるかと思います。
また、Access Violation(というよりx86のプロテクトモードの例外機構)については
・はじめて読む486
が参考になるかと思います。

このQ&Aは役に立ちましたか?3 件

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

新しく質問する

新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集