При запуске приложения со следующей функцией
int stat_image(unsigned char *image, int x0, int y0, int frame_size){
int i,j, w=Grab_Width;
int xm = x0 + frame_size;
int ym = y0 + frame_size;
double d, avr, std;
unsigned char *bp, pix, vmin, vmax;
unsigned int *hist;
unsigned char notv = 0x23;
vmax = 0;
for(j=y0; j<ym; j++){
bp = &image[w * j + x0];
for(i=x0; i<xm; i++, bp++)
if(vmax < *bp) vmax = *bp;
}
if(vmax == 0) return 0;
hist = (unsigned int*) calloc(vmax, sizeof(int));
vmin = vmax;
for(j=y0; j<ym; j++){
bp = &image[w * j + x0];
for(i=x0; i<xm; i++, bp++){
pix = *bp++;
hist[pix]++;
if(vmin>pix) vmin = pix;
}
}
if(vmax==vmin && vmax==notv){
free(hist);
return 0;
}
for (avr=0.,i=0,j=vmin; j<=vmax; j++) {
avr += (double)hist[j]*j; // накапливаем уровень сигнала в выбранном диапазоне яркостей
i += hist[j]; // и количество пикселей в заданном диапазоне
}
if(avr > 1. && i != 0) avr /= i; // средний уровень яркости
for(std=0.,j=vmin; j<=vmax; j++){
d = j-avr; // отклонение от среднего
std += d*d*hist[j]; // взвешенный квадрат отклонения
}
if(i != 0) std = sqrt(std/i); // среднеквадратическое отклонение
MSG("\n\nFREE HIST: size=%d, hist[last]=%d\n", vmax, hist[vmax-1]);
free(hist);
if(avr < MIN_AVR_LEVEL || std < MIN_STD_LEVEL) return 0;
else return 1;
}
... double free or corruption (!prev) ...
Если я убираю этот free, все работает - но ведь мусор-то тогда накапливается! Судя по MSG, free явно вызывается в первый раз, но почему-то приводит к такой странной ошибке. С чем это может быть связано?