Значение ESP не было должным образом сохранено при вызове функции.
Такое поведение обычно указывает на то, что вызывающий код был скомпилирован с определением класса или функции, отличным от кода, который создал конкретный рассматриваемый класс.
Возможно ли, что вместо недавно созданной версии загружается другая версия dll компонента? Это может произойти, если вы копируете вещи как часть шага после сборки или если процесс запускается из другого каталога или изменяет свой путь поиска dll перед выполнением LoadLibrary
или его эквивалента.
Я чаще всего сталкивался с этим в сложных проектах, где определение класса изменяется для добавления, удаления или изменения сигнатуры виртуальной функции, а затем выполняется пошаговая сборка, и не весь код, который нужно перекомпилировать, фактически перекомпилировать. Теоретически это может произойти, если какая-то часть программы перезаписывает vptr или vtables некоторых полиморфных объектов, но я всегда обнаруживал, что неправильная частичная сборка является более вероятной причиной.
Это может быть «ошибка пользователя», разработчик намеренно говорит компилятору строить только один проект, когда нужно перестроить другие, или это может быть несколько решений или несколько проектов в решении, где зависимости установлены неправильно.
Очень редко Visual Studio может проскальзывать и не получать корректные сгенерированные зависимости, даже если проекты в решении правильно связаны. Это случается реже, чем Visual Studio обвиняют в этом.
Удаление всех промежуточных файлов сборки и перестройка всего из исходного кода обычно решает проблему. Очевидно, что для очень крупных проектов это может быть серьезным наказанием.