例外処理 (初回) について

[戻る]
たけ 2005/03/08(火) 16:03:58
デバッグ実行すると
「例外処理 (初回) は xxx.exe にあります: 0xC0000005: Access Violation。」
というメッセージが頻発するようになってしまいました。
(xxx.exeは作ったアプリケーション)

このメッセージが表示されても、アプリケーションエラーになるわけでもなく
普通に処理は続行されます。

また発生するタイミングは、アプリケーションクラスのコンストラクタで
ブレークポイントで止めた時点でもう1つ発生しています。
それ以降は、連発します。

このような経験のある方、いらっしゃいますでしょうか?

環境 VC6.0,Windows2000

PATIO 2005/03/08(火) 16:17:14
たまたまうまく動いているように見えているだけだと思います。
例外が出ていると言うことはプログラム的に拙いとこるがある所為だと思うので
そこをきちんと抑えて出なくなるまで追い詰めないと解決しないでしょう。
デバッグ版の場合はデバッグ用の領域が余分に取られている所為で
例外が発生しても何とか動いてしまう場合もありますが、
アクセスバイオレーションが出ていると言うことは間違いなく領域外にアクセスして
いるということなので実際には問題が大きいと思います。

たけ 2005/03/08(火) 17:01:41
やはり問題は大きいですか。

しかし、アプリケーションクラスのコンストラクタですでに
発生してしまっていることから、何から調べようかと悩んでいます。

PATIO 2005/03/08(火) 17:12:38
自作のDLLをリンクしているような場合に実際にリンクしているDLLと
使用時にロードされているDLLのバージョンが違うとおかしな動作になる場合があります。
あとは何らかの原因でプロジェクト内のオブジェクトファイルのバージョンに不整合が
起きているとかそういう場合もおきる事があります。
ヘッダーファイルを変えた後でフルビルドを行っていない場合などに起きます。
この場合は、一度、プロジェクトをクリーンしてビルドしなおすと解決できることがあり
ます。
これらでないのであれば、コーディングミスがどこかにあるとしか言えないですね。
それこそ少しずつコメントアウトでもしながら原因を特定するしかないかもしれません。

たけ 2005/03/08(火) 17:30:11
モーダルダイアログを使用しており、
アプリケーションクラスに以下のようにメンバ変数を持っています。

これを以下のように修正したところ、現象が収まりました。

    CXXXDlg *m_pXXXDlg;
↓
    CWnd *m_pXXXDlg;

現象が出なくなったのですが、これって何かの解決になってますでしょうか?

PATIO 2005/03/08(火) 17:38:40
これだけで収まったと言うのが良くわからないです。
インスタンスをメンバー変数に持っていたと言うのであれば、まだわかるんですが、
ポインタですし。
CXXXDlgのポインタで宣言していると拙い使い方でもしていたんでしょうか。
因みにこのメンバー変数の初期化は初期化子できちんとやっていますか?
やってないと初期値にとんでもない値が入っていそうですけれど。

なぜ収まっているのかがはっきりわからないと解決になっていないような気がします。
現象が変わっただけでさらにややこしい事になっている可能性もありますし。

たけ 2005/03/08(火) 17:52:05
>これだけで収まったと言うのが良くわからないです。
>インスタンスをメンバー変数に持っていたと言うのであれば、まだわかるんですが、
>ポインタですし。
そうなんですよ。だから解決にはしませんでした。

>CXXXDlgのポインタで宣言していると拙い使い方でもしていたんでしょうか。
>因みにこのメンバー変数の初期化は初期化子できちんとやっていますか?
>やってないと初期値にとんでもない値が入っていそうですけれど。
アプリケーションクラスのコンストラクタで
m_pXXXDlg = NULL
としています。

また、現象は、上記の初期化の前に起きていました。

>なぜ収まっているのかがはっきりわからないと解決になっていないような気がします。
>現象が変わっただけでさらにややこしい事になっている可能性もありますし。
また、現象が出るような気がしますので、そのときはまた書き込みさせて頂きます。

PATIO 2005/03/08(火) 18:19:07
そのクラスのメンバー変数で初期化子で初期化できるものは全て初期化子で初期化した方が
多分良いと思います。
コンストラクタのコードの部分で初期化しても、その部分が動く前に例外が発生した場合は
初期化のコードを通りませんから。
初期化していない状態で例外の後始末が走ってポインタの内容がNULLでないのでdeleteに
行っておかしくなると言うパターンもありえると思います。
アプリケーションクラスのコンストラクタで「初期化子」を使って初期化する事をお勧め
します。

あと、今ここに書き込んでいる内容からでは原因は得的で着ないように感じます。
実際には他の箇所の記述等が絡み合って起きているかもしれませんし。

PATIO 2005/03/08(火) 18:21:01
誤字

誤)
あと、今ここに書き込んでいる内容からでは原因は得的で着ないように感じます。

正)
あと、今ここに書き込んでいる内容からでは原因は特定できないように感じます。

とおりすがり 2005/03/10(木) 14:18:53
そのメッセージは例外が起きたけど例外処理で上手く処理したというメッセージなので
気にしなくていいと思われ。。。

PATIO 2005/03/11(金) 12:08:25
正常に動いているのにアクセスバイオレーションの例外が起こるとは思えないんですが、
大丈夫なんですか?
少なくとも私は怖いので原因を追及すると思うんですが。
起こるべくして起こっていてそれが予想通りの動きで予想通りに処理されていると
言うのであれば、問題はないのでしょうけれど。
どなたか識者の方でお解かりの方がいらっしゃいましたらよろしくお願いします。

とおり 2005/03/12(土) 03:43:16
とりあえず、質問者がこれ以上具体的なコード等を示さないなら、話は進まなそう。

古いスレッドには追加発言できません。