У меня есть класс, C. C имеет переменную-член, объявленную как: bool markerStart;
Изнутри 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!
Может кто-нибудь подсказать, с чего начать поиск решения этой проблемы?
Обновление: спасибо за помощь.
Без кода для любого из вас было почти невозможно решить проблему. То, что я искал, было намеками на то, где начать искать. Большинство из вас предоставили отличные советы, так что спасибо!
Я наконец нашел проблему. В этом случае выравнивание было установлено в одном классе и не было правильно сброшено после критического блока кода. Класс с ошибочным выравниванием был скомпилирован непосредственно перед объявлением класса C - отсюда и проблема.