例外処理 (初回) について – プログラミング – Home

例外処理 (初回) について
 
通知
すべてクリア

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


たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

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

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

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

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

環境 VC6.0,Windows2000


引用解決済
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

やはり問題は大きいですか。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

モーダルダイアログを使用しており、
アプリケーションクラスに以下のようにメンバ変数を持っています。

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

CXXXDlg *m_pXXXDlg;

CWnd *m_pXXXDlg;

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

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

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

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

誤字

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

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


返信引用
とおりすがり
 とおりすがり
(@とおりすがり)
ゲスト
結合: 23年前
投稿: 180
 

そのメッセージは例外が起きたけど例外処理で上手く処理したというメッセージなので
気にしなくていいと思われ。。。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
とおり
 とおり
(@とおり)
ゲスト
結合: 21年前
投稿: 43
 

とりあえず、質問者がこれ以上具体的なコード等を示さないなら、話は進まなそう。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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