質問 |
||
| 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 |
|
| |
| この回答へのお礼 | ありがとうございます。 参考にさせていただきます。 |