Проблема, наконец, была обнаружена в условии завершения цикла for (int j = i; j <= N / i; j++)
, а не в free()
. Изменение на for (int j = i; j < N / i; j++)
решило проблему повреждения кучи.
Как и Какой-то программист чувак указал в комментариях, исключение Out Of Bounds происходило без уведомления отладчика. Находясь в Visual Studio, где я в основном пишу код на C #, у меня была иллюзия, что, если что-то пойдет не так, я, по крайней мере, получу исключение в строке, где могут произойти плохие вещи.
Это не случай, так как C не имеет никакой проверки границ. Неопределенное поведение имеет тенденцию работать "хорошо" в некоторых случаях, тогда что-то незначительное изменяется, когда все ломается. Как указал AbbysSoul , повреждение кучи происходило во всех случаях, даже если BENCH
не определено. Когда критическая операция, такая как free()
, была вызвана в поврежденной куче, процесс был обречен на крах.
Большой урок здесь - проверка всех строк кода в программе на C, особенно когда вы не видите ошибки в строке, где происходит исключение.