1. ホーム
  2. C++

の 0x091f11c7 での未処理例外について。0xC0000005: アクセス違反の読み取り位置 0x0ab0f

2022-01-23 09:55:10

元のアドレス

<スパン クラッシュメッセージ

0xC0000005 の 0x091f11c7 で未処理の例外が発生しました。場所 0x0ab0f6cc を読み取るアクセス違反が発生しました。

このようなクラッシュメッセージは、文字通り、アドレス0xC0000005にある何かがアクセスできないことを意味します。

このエラーの原因は何かというと 以前、このような質問をしたことがあるのですが、その時は非常にレベルの低いエラーでした。グループ内でこの質問をしたら、答え方を知っている人が「変数が初期化されていないみたい」と言ったので、明らかに初期化したと思ったのですが、なぜでしょうか?-. その後、問題を発見し、十分な愚かなああがあることを言いたかった、私はクラスのメンバー変数を設定し、クラスのメンバー関数の中で同じ名前のローカル変数を定義し、直接等しい、そして、プログラムはここでクラッシュした= =。 そんなことがあるのでしょうか?あまりに低レベルなこのエラーと言うことにしておきましょう。十分な内省をしてから、振り返って、具体的にアドレスやエラーから問題を探し出すと、人はどうしてそんなに強力なんだろうと思ってしまいました。それから探し始めて、後でこんなのを見つけました、どこで見たか忘れましたが、どんなメモリアドレスがどんな値に初期化されるのかについてです。普通でない値だと0xffffffとか覚えているようです。この情報は本当に忘れてしまったので、情報が見つかったらまた投稿します。

<スパン 上の質問については、もしかしたら 

<スパン 1. ワイルドポインターアクセス  

2. 配列のアクセスは範囲外です。 

3. マルチスレッドで正しく同期されないと問題が発生する 

4. 解放されたポインタにアクセスする。  

これらの単純な真実が問題の根本原因であり、いくつかの低レベルのエラーをよりよく回避するために、コードを標準化するためにもっと努力することが重要である。このような理由が考えられます。もし何か追加することがあれば、遠慮なくコメントで追加してください~~~ ^_^~~。


<スパン 内部でのデバッグ vs. 内部でのデバッグ メモリが割り当てられた場合、0xcdで埋められます。解放されたメモリは0xddで埋められます。保護されたメモリは0xfdでパッドされます。

以下、詳しく説明します。

* 0xcccccc : MicrosoftのC++デバッグ用ランタイムライブラリで、初期化されていないスタックメモリをマークするために使用されます。

* 0xcdcdcdcd : Microsoft の C++ デバッグ用ランタイムライブラリが、未初期化のヒープメモリをマークするために使用します。

* 0xfeeefeee : マイクロソフトのHeapFree()が解放されたヒープメモリをマークするために使用します。

* 0xababab : マイクロソフトのHeapAlloc()で使用され、ヒープメモリを割り当てた後のガードバイトをマークするために使用されます。

* 0xabadcafe : この値にスタートアップすると、すべての空きメモリが初期化され、誤ったポインタをキャッチすることができます。

* 0xbaadf00d : Microsoft の LocalAlloc(LMEM_FIXED) が、初期化されていないヒープメモリをマークするために使用します。

* 0xbadcab1e : デバッガとの接続が切断されたときに Microsoft eVC デバッガに返されるエラーコードです。

* 0xbeefcace : Microsoft .NET がリソースファイルのマジックナンバーとして使用します。

通常、私たちは上記の3つの一般的なものを知っていればよいのです。0xcccccccc、0xcdcdcdcd、0xfeeefeeeの3つを知っていれば、問題の特定や迅速な分析が可能になります。

<スパン 0xccccccccと0xcdcdcdcdの場合 デバッグモードでは、VCは初期化されていないスタックメモリ上のすべてのポインタを0xcccccc(文字列として見た場合、"hot hot hot ......")とし、初期化されていないヒープメモリ上のすべてのポインタを0xcdcdcdcd(文字列として見た場合、"Tun Tun Tun ......")として満たします。では、なぜデバッガはこのような動作をするのでしょうか。VCのDEBUG版は、初期化されていないポインタをランダムな値にするのではなく、自動的に0xccccccや0xcdcdcdcdに初期化します。これは、ワイルドポインタの初期値が確かでない場合、デバッグプログラムを容易にするためです。そのため、自動初期化の目的は、初期化されていないワイルドポインタを使用していることを一目で分かるようにすることです。

<スパン 0xfeeefeeの場合 は、ヒープ上で解放されたメモリをマークするために使用されます。ポインタが指すメモリが解放されても、変数 variable 自体のアドレスが変わっていなければ、以前指していたメモリのアドレスのままであることに注意してください。ポインタがクラスへのポインタで、そのクラスがポインタ変数を含んでいる場合、メモリが解放された後(C++のクラスでは通常delete操作を行う)、そのクラスのポインタ変数には値0xfeeefeeが代入されることになります。デバッグの初期段階で値0xfeeefeeを持つポインタが見つかった場合、対応するメモリは解放され、我々のコードは何かが間違っていることになります。

タグ 0xababab, 0xabadcafe, 0xbaadf00d, 0xbeefcace, 0xcccccc,0xcdcdcd, 0xfeeefee, 取扱い不能例外, 0x091f11c7 で取扱い不能例外 : 0xC0000005: アクセス違反の読み取り位置 0x0ab0f6cc, メモリアクセスの問題