次の Visual C++ デバッガー セッションのスクリーンショットを見てください。
(ソース: lviv.ua )
実行ポイントは仮想関数内になりました。「mDb」は、そのクラスのメンバーであるオブジェクトへの参照です。「mDb」のタイプはCDbBackend&です。スレッドは 1 つだけです。赤い四角形の値は等しいはずですが、そうではありません。これはどのように可能ですか?
デバッグ中のコードは、BoundsChecker (メモリ デバッガーおよびプロファイラー) でインストルメント化されています。この不一致は、後でクラッシュにつながります。インストルメント化されていないコードは、これらの影響のいずれにもつながりません。BoundsChecker のせいにするのは時期尚早だと思います。BoundsChecker が明らかにした私のプログラムの隠れたバグである可能性は十分にあります。そのため、状況を理解したいと強く思っています。
"b = &mDb" ステートメント用に生成されるアセンブリは、関連する場合は次のとおりです。ウォッチとレジスタが表示されたこのアセンブリのステップ実行は、ここでキャプチャされます(500kb の avi ファイル)。
007AB7B0 push 4
007AB7B2 push 80000643h
007AB7B7 push 4
007AB7B9 push 0C0002643h
007AB7BE lea eax,[ebp-10h]
007AB7C1 push eax
007AB7C2 call dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)]
007AB7C8 mov eax,dword ptr [eax]
007AB7CA add eax,1CCh
007AB7CF push eax
007AB7D0 call dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)]
007AB7D6 mov dword ptr [ebp-70h],eax
007AB7D9 push dword ptr [ebp-70h]
007AB7DC push 4
007AB7DE push 50000643h
007AB7E3 lea eax,[ebp-20h]
007AB7E6 push eax
007AB7E7 call dword ptr [_numega_finalcheck_Y_110456 (8FA8ECh)]
007AB7ED mov ecx,dword ptr [ebp-70h]
007AB7F0 mov ecx,dword ptr [ecx]
007AB7F2 mov dword ptr [eax],ecx