При правильных параметрах Visual C ++ создает защитное значение в конце каждого буфера. Когда вы освобождаете буфер, он проверяет, что это все еще действует. Если нет, то возникает ошибка, которую вы видите.
Наиболее частой причиной этой ошибки является переполнение буфера. Однако это может (теоретически) быть вызвано случайной записью указателя (в конце концов, может записать в защитное значение).
Шансы, тем не менее, перерасход.