Похоже, ошибка в среде выполнения C. Используя Visual Studio 2008 на Windows 7, я воспроизвел ту же проблему. После некоторой быстрой отладки, установив точки останова в dlmalloc
и dlfree
, я увидел, что dlfree
вызывается с адресом, который он никогда не возвращал ранее из dlmalloc
, а затем вскоре после этого совершил нарушение доступа. 1005 *
К счастью, исходный код среды выполнения C распространяется вместе с VS, поэтому я мог видеть, что этот вызов free
исходил из функции __endstdio
в _file.c
. Соответствующее распределение было в __initstdio
, и он вызывал _calloc_crt
для выделения своей памяти. _calloc_crt
вызывает _calloc_impl
, что вызывает HeapAlloc
для получения памяти. _malloc_crt
(используется в другом месте во время выполнения C, например, для выделения памяти для среды и для argv
), с другой стороны, вызывает прямо на malloc
, а _free_crt
вызывает прямо на free
.
Таким образом, для памяти, которая выделяется с помощью _malloc_crt
и освобождается с помощью _free_crt
, все в порядке и великолепно. Но с памятью, которая выделяется с помощью _calloc_crt
и освобождается с помощью _free_crt
, случаются плохие вещи.
Я не знаю, поддерживается ли замена malloc
, как это поддерживается - если это так, то это ошибка с CRT. Если нет, я бы посоветовал изучить другую среду выполнения C (например, MinGW или Cygwin GCC).