Поскольку вы говорите, что этот указатель внезапно меняет значение, я начинаю верить, что это связано с повреждением кучи.С другой стороны, поскольку вы говорите, что это связано с оптимизированным кодом или нет, оно также может быть связано со стеком.Оптимизатор выполняет одну из функций: он удаляет неиспользуемые переменные, помещенные в стек, к которым никогда не осуществляется доступ.
Фактически это означает, что когда вы не компилируете в оптимизированном режиме, будет больше переменныхв стеке, что делает структуру памяти несколько иной и в некотором смысле добавляет больше места в стеке, что может оказать огромное влияние на реакцию программного обеспечения, например, на переполнение стека.
Если существуют локальные переменныекоторые никогда не используются, программе все равно, если вы испортите память никогда не использовавшихся локальных переменных.Только когда вы повреждаете память, которую вы фактически используете, это становится проблемой.
Существуют различные уровни предупреждений (четыре, если я не ошибаюсь), которые вы можете указать компилятору использовать.Если вы используете самое высокое, предупреждение будет рассматриваться как ошибка компилятора, что остановит процесс компиляции.Таким образом, вы можете заметить локальные переменные, которые будут удалены при оптимизации кода и могут приблизить вас к реальной проблеме.Начните поиск по этим областям кода, чтобы начать с.
Я также предлагаю вам вырезать код и тестировать, просто чтобы исключить, где находится проблемный код, и постепенно выкапывать проблему.Когда у вас нет информации, вы должны начать с самого начала (основной цикл программы) и попытаться изолировать и исключить части кода, который работает нормально.«Если я закомментирую этот вызов функции, то он не сбоит» может дать вам подсказку:)