私はクラスを持っています。C. Cには以下のように宣言されたメンバ変数があります。sizeof(* this)は間違った値を返します
C内から、sizeof(* this)の呼び出しは0x216バイトの値を返します。
C内の他の場所では、次のようにします。markerStart = false;
markerStartをfalseに設定するのではなく、実際にはこの呼び出しはメモリ内の次のクラスの開始点を壊しています。
逆アセンブルコードを見てみると、私は見つける:
markerStart = false;
06FB6B7F mov eax, dword ptr [this]
06FB6B78 mov byte ptr [eax+218h], 0
二移動命令がゼロにこの+ 0x218でバイトを設定しているが、クラスだけ0x216バイト長であることから、これはメモリをつかうれます!
コメントに応じて、間違いなくmarkerStart = false命令です。逆アセンブラビューとメモリビュー(そしてデータブレークポイントを使ってWindbgを使用)で起こっているのを見ることができます。次のクラスの最初のバイトはゼロに設定され、そのvftblポインターが壊れます。
注:markerStartのアドレスを取得し、これを減算すると、0x211が生成されます。
誰でも私にこの問題を解決するために探し始めるための手がかりを与えることができますか?
更新:すべてのヘルプありがとうございます。 コードなしでは、あなたの誰かが問題を解決することは不可能でした。私が探していたのは、どこから探し始めるかのヒントでした。あなたの大部分は素晴らしいヒントを提供しました。ありがとうございます!
私はついにこの問題を発見しました。この場合、アライメントは1つのクラスに設定されており、クリティカルなコードブロックに続いて正しくリセットされていませんでした。 Cの宣言の直前に、整列の誤りがあるクラスがコンパイルされていました。そこで問題が発生した場所です。
問題を説明する実際のC++コードを投稿してください –
実際のコードを投稿できますか? Cの定義は良いスタートになるでしょう – PaulJWilliams
おそらく218!= 0x218 – Skizz