Dev環境はVS2010であり、言語は32ビットWindows用にコンパイルされたC#(GUI)とC++(Sim Engine)が混在しています。 32ビットのXP、32ビットのVista、32ビットの7、および64ビットの7を含むWindowsのすべてのバージョンで例外が発生します。ポインタが無効になっています。アクセス違反の原因となるもの
私は完全にこの問題を抱えています。プログラムの性質(イベントベースのシミュレーション)のため、実際にアクセスしてAVEを取得しようとする前に、ポインタはある時点で無効になります。私はを行う何
は、それは非常に特定の方法で無効にされていることである、と私はそこに誰かがこれを引き起こす可能性があるものにとアイデアを持っているかもしれません願っています知っています。 AVEが発生した場合、それが使用しようとしていたポインタがに変更されました:
(original) - ((size * 2) - 1)
original
は元のアドレスである場合は、ポインタで指され、size
が指されているオブジェクトのサイズです。例えば
、アクセス違反の一つはが0x58E0
を指摘しておく必要があり、オブジェクトが0x70
のサイズを有していたポインタに発生しました。 0x58E0
を指す代わりに、それは0x5801
であり、これは0x58E0 - ((0x70 * 2) - 1)
です。同じことが異なるタイプとサイズの別のオブジェクトで起こるので、それは非常に特定の関係であるようです。
編集:私はコード内のポインタ演算を行うことについて話ないだ上で、私は唯一のポインタはなるとそれが我々はそれを参照して取得するときのように終わるべき間の数学的関係を示す午前中アクセス違反例外。物事をクリアする希望。
編集2:私が覚えている限り、この問題は標準ベクトルのメンバーであるオブジェクトでしか見ていないことがわかりました。このような動作を引き起こした可能性のあるベクター実装で、私たちがねじ込んでいた可能性のあるものはありますか?
ポインタ演算を行う場合、単位は1バイトではなく1つのオブジェクトの単位になります。サイズを乗算するのは問題があるようです。ポインタの算術を理解することを再度確認してください。おそらく、あなたは単にオリジナル - 1を意味します。 –
@KerrekSB変数 '元で'彼はおそらく整数として解釈されたオブジェクトの元のアドレスを意味します –
私は申し訳ありませんが、私は投稿で十分に明確ではありませんでした。私はコード内でポインタ演算をしていません、上のポインタは何をするべきか、そして私たちが(今)無効なポインタを参照してアクセス違反を取得しようとしたときに終わるもの例外。 – gtftw