Есть два класса - родитель (Capture) и потомок (Camera). В родителе реализована одна общая функция, которая вызывает функцию, переопределённую у потомков:
bool Capture::WriteJPEG(const char * filename){
unsigned char *frame;
unsigned int size = GrabRGB(&frame);
if( size){if(!jpge::compress_image_to_jpeg_file(filename, BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight, 3, frame, Compressor)) size = 0;}
free(frame);
return size!= 0;
}
В GrabRGB должна выделяться память под внешний массив (передаётся параметром), но этого не происходит:
unsigned int Camera::GrabRGB(unsigned char **out){
WaitForSingleObject(M_Capture, INFINITE);
capGrabFrame(CaptureWindow);
unsigned int size = FrameSize;
if( size){
*out = (unsigned char *)realloc(*out, size);
if(*out){memcpy(*out, FrameBuffer, size);}
else{size = 0;}
}
else{free(out);}
ReleaseMutex(M_Capture);
return size;
}
Если убрать проверку if(*out), то на memcpy будет ошибка сегментации. При этом я делал cout-ы на FrameSize и FrameBuffer - там всё в порядке, есть и размер, и полный буфер с кадром.
Помогите пожалуйста понять и устранить причину не выделения памяти.
unsigned char *frame;
unsigned int size = GrabRGB(&frame);
Итак, frame ненинициализирована и содержит мусор.
*out = (unsigned char *)realloc(*out, size);
Что вы хотите реаллоцировать? В *out - мусор. Указатель фиг куда - естественно, что realloc не работает.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей