ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4007917 VC++のエラー(初回の例外)の原因と回避策
質問者:maki55555 VC++のプログラムを作っていて、たまに実行中に異常終了してしまうことがあります。
「****初回の例外が発生しました: 0xC0000005: 場所 ******* を書き込み中にアクセス違反が発生しました。 」
プログラム的にはメモリファイルマッピングして、そのデータをmemcpyでコピろうとする時にこの関数で上記エラーがでます。
毎回出るわけではなく、何度も実行される(ループなどで)とたまにおきているみたいです。
具体的にはどのような場合にこのようなエラーが生じるのでしょうか?
また回避策はありますでしょうか?
困り度:
  • 困っています
質問投稿日時:
08/05/08 23:25
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

ANo.2 0xC0000005はEXCEPTION ACCESS VIOLATIONと呼ばれ
プログラム上のメモリアクセス違反を意味します。
>何度も実行される(ループなどで)とたまにおきているみたいです。
たまにおきているのではなく、
たまたま動いているという可能性もあります。

>どのような場合にこのようなエラーが生じるのでしょうか?
このエラーが起こる原因は、殆どがプログラムミスで
書き込み、または読み込みしてはイケナイ領域に対しての
アクセスが原因です。

やり易い例としては
char str[4];
strcpy( str, "test" );
strは4バイト分の領域ですが、strcpyはtestの4バイトと
'\0'含んだ全部で5バイトのデータをstrに書き込もうとします。

>回避策はありますでしょうか
回避策はありません。
れっきとしたバグなので、バグをつぶす以外に
解決策はありません。

VCではDebug実行して例外が発生すれば、
そのソース部分を表示してくれると思いますので、
(きちっとした環境を構築していれば)
Debug実行してみれば分かると思います。
回答者:aris-wiz
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/05/09 11:49
この回答へのお礼ありがとうございます。
参考にさせていただきます。

回答

ANo.1 0xC0000005なら アプリで管理しているメモリー空間以外にアクセスしようとしたといったことでしょう
memcpyなら転送元か転送先のアドレスか転送するバイト数のどれかに不具合が生じるのでしょう

転送元が100バイトしか無いのに120バイト転送しようとしたとか

エラー箇所がはっきりしているなら ログファイルに
何回目、転送元アドレス、転送先アドレス、転送バイト数
といった情報を書き込んでみてはいかがでしょう

MFCで作成しているのであれば afxDumpオブジェクトに <<でシリアライズしてもいいでしょう
VC++IDEの『出力ウィンドウ』に結果が出力されます
回答者:redfox63
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/09 00:53
この回答へのお礼ありがとうございます。
参考にさせていただきます。
 
最新から表示回答順に表示