2012-01-26 27 views
2

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:私が覚えている限り、この問題は標準ベクトルのメンバーであるオブジェクトでしか見ていないことがわかりました。このような動作を引き起こした可能性のあるベクター実装で、私たちがねじ込んでいた可能性のあるものはありますか?

+0

ポインタ演算を行う場合、単位は1バイトではなく1つのオブジェクトの単位になります。サイズを乗算するのは問題があるようです。ポインタの算術を理解することを再度確認してください。おそらく、あなたは単にオリジナル - 1を意味します。 –

+1

@KerrekSB変数 '元で'彼はおそらく整数として解釈されたオブジェクトの元のアドレスを意味します –

+1

私は申し訳ありませんが、私は投稿で十分に明確ではありませんでした。私はコード内でポインタ演算をしていません、上のポインタは何をするべきか、そして私たちが(今)無効なポインタを参照してアクセス違反を取得しようとしたときに終わるもの例外。 – gtftw

答えて

0

腐敗の性質は、誰かがreallocを使いこなすことを示唆しています。

+0

私はVSで "realloc"の "Find"を実行しましたが、何も見つかりませんでしたので、直接呼び出すことはありません。何か重要な場合は、私が考える限りでは、この問題はベクトルのメンバーであるオブジェクトでのみ見られたようです。この種の問題を引き起こしている可能性がある私たちのベクトル実装で探していたものは何ですか? – gtftw

+0

あなたは行き​​ます。ベクトル呼び出しrealloc。代わりにVectorにオブジェクトへのポインタを格納してみてください。 – Joshua

0

私が覚えている限り、私たちはstdベクターのメンバーであるオブジェクトでこの問題を見ただけです。このような動作を引き起こした可能性のあるベクター実装で、私たちがねじ込んでいた可能性のあるものはありますか?

これはベクターの実装には問題ありません。使用方法には問題があります。

vectorは、容量を増やす度にイテレータと既存のオブジェクトへのポインタを無効にすることが最も確実です。あなたが見ている特有の数学的関係は、あなたの特定の実装の成長パターンに関連するでしょう。

解決策は、ベクトルのサイズが変化している間にベクトルの内容を指すポインタを保持しないことです。ベクトルとインデックスへのポインタを保持することができます。これは引き続き有効です。

+0

私はもっと具体的にすべきでした:私たちのベクトルはオブジェクトへのポインタだけを格納します。あなたが話していることはまだその場合に適用されますか?また、これは、シナリオの全期間中に1つのメンバーしか持たないベクトルによって指示されたオブジェクトで、少なくとも1回は起こっています。 – gtftw

+0

@gtftw: "std :: vector'のメンバーであるオブジェクトはどうですか?あなたがポインタを持っていて、そのポインタのコピーもベクトルにあれば、そのベクトルはそれとは何の関係もありません。または、ベクトルに格納されているポインタが変更されていますか? –

関連する問題