C というクラスがあります。C には次のように宣言されたメンバー変数があります。
C 内から sizeof(*this) を呼び出すと、0x216 バイトの値が返されます。
C 内の他の場所では、markerStart = false; を行います。
この呼び出しは、markerStart を false に設定するのではなく、実際にはメモリ内の次のクラスの開始を破壊しています!
逆アセンブルされたコードを見ると、次のことがわかります。
markerStart = false;
06FB6B7F mov eax, dword ptr [this]
06FB6B78 mov byte ptr [eax+218h], 0
2 番目の移動命令は、この + 0x218 のバイトを 0 に設定していますが、クラスの長さが 0x216 バイトしかないため、これはメモリを破壊しています!
コメントに応じて、それは間違いなくmarkerStart = false命令です。逆アセンブラー ビューとメモリ ビュー (およびデータ ブレークポイントを使用して Windbg を使用) で発生する様子を見ることができます。次のクラスの最初のバイトがゼロに設定され、vftbl ポインタが台無しになります。
注:markerStart のアドレスを取得して、これから減算すると、0x211 が得られます。
この問題を解決するためにどこから始めるべきかについて、誰かが私に手がかりを与えることができますか?
更新: ご協力ありがとうございます。コードがなければ、この問題を解決することはほぼ不可能でした。私が探していたのは、どこから探し始めるかについてのヒントでした。あなたのほとんどは素晴らしいヒントを提供してくれました。ありがとうございます!
私はついに問題を見つけました。この場合、アラインメントは 1 つのクラスで設定されており、重要なコード ブロックの後に正しくリセットされていませんでした。クラス C の宣言の直前に、アラインメントに問題のあるクラスがたまたまコンパイルされたため、問題が発生しました。