Похоже на проблему «висящего указателя»: у вас есть мошеннический указатель, который указывает на память, которая не принадлежит ему (например, не выделенный экземпляр типа, на который указывает указатель), и где-то программа инструктирует указатель использовать это «значение», и теперь указатель перезаписывает это значение (которое случайно попадает на проверяемое вами значение).
Ваши симптомы совпадают: перемежающаяся, перезапись памяти при появлении не должно быть перезаписи памяти.
Их может быть очень больно отследить, потому что вам нужно проверить целостность всех ваших операций с указателями, даже тех, которые не имеют никакого отношения к коду, который вы просматриваете в данный момент (мониторинг) .
Одна вещь, которая поможет вам отследить это, - это явная инициализация всех указателей на «ноль» при создании экземпляра. Как правило, в этом нет необходимости, но это может быть полезно для отладки, поскольку indirection-on-null обычно приводит к аварийному завершению вашей программы прямо там (что вам нужно), а не остается «скрытой проблемой», поскольку Вы получаете доступ к памяти, которая не принадлежит вам (потому что указатели в C по умолчанию не инициализируются нулем). Так, например:
int* p; // Initialized to "garbage" memory address
... изменить на:
int* p = NULL; // Force initialization for debugging, crashes on indirection
С другой стороны, когда вы достаточно страдаете, у вас есть привычки, которые заставляют вас очень осторожно обращаться с указателями. ; -)))