Regardez cette capture d'écran d'une session de débogage de Visual C++:débogueur Visual C++ et BoundsChecker mystère
http://yp.lviv.ua/philez/wtf.PNG
Le point d'exécution est maintenant à l'intérieur d'une fonction virtuelle. "mDb" est une référence à un objet qui est le membre de cette classe. "mDb" a le type CDbBackend &. Il n'y a qu'un seul fil. Les valeurs dans les rectangles rouges devraient être égales, ... mais elles ne le sont pas. Comment cela est-il possible?
Le code en cours de débogage a été instrumenté avec BoundsChecker (un débogueur de mémoire et un profileur). La divergence conduit à un accident plus tard. Le code non instrumenté n'entraîne aucun de ces effets. Je pense qu'il est trop tôt pour blâmer BoundsChecker - il pourrait bien s'agir d'un bug caché dans mon programme que BoundsChecker a révélé, c'est pourquoi je suis très enclin à comprendre la situation.
L'assemblage généré pour l'instruction "b = & mDb" est le suivant, dans le cas où cela est pertinent. Le déplacement à travers cet assemblage, avec la montre et les registres visibles, est capturé here (fichier avi de 500 kb).
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
Oui.Il a le type de CDbBackend & et est déclaré dans la classe de base. Je suis en train d'éditer le post. Quoi qu'il en soit, la différence entre les pointeurs est si énorme qu'il pourrait difficilement être un décalage lié à la disposition de l'héritage. – user38329