Каждый раз, когда вы делаете что-то, что не определено в стандарте языка, это неопределенное поведение, и один из способов, которым это может проявиться, - это повреждение кучи. Есть около трех миллионов способов сделать это в C ++, так что это действительно невозможно сказать.
Несколько распространенных случаев - двойное освобождение динамически выделяемой памяти или запись за пределы массива. Или запись в неинициализированный указатель.
В последних версиях компилятора Microsoft добавлен переключатель компилятора / analysis, который выполняет статический анализ для выявления таких ошибок. В Linux valgrind является очевидным выбором.
Конечно, вы используете VC6, который не поддерживается годами, и в котором есть ряд известных ошибок, в результате чего генерируется неверный код.
Если возможно, вам следует перейти на правильный компилятор.