Не срабатывает realloc с разыменованием указателя

261
04 декабря 2017, 17:31

Есть два класса - родитель (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 - там всё в порядке, есть и размер, и полный буфер с кадром.

Помогите пожалуйста понять и устранить причину не выделения памяти.

Answer 1
unsigned char *frame;
unsigned int size = GrabRGB(&frame);

Итак, frame ненинициализирована и содержит мусор.

*out = (unsigned char *)realloc(*out, size);

Что вы хотите реаллоцировать? В *out - мусор. Указатель фиг куда - естественно, что realloc не работает.

READ ALSO
Определить какая кнопка зажата (стиль)

Определить какая кнопка зажата (стиль)

Есть, например, 200 кнопок (обычная и radiobutton)

291
Ключ шифрования в base64

Ключ шифрования в base64

Генерирую ключи RSA шифрованияKак правильно сделать из них base64 для хранения и передачи и как правильно вернуть из base64 key ? Если можно, приведите...

295
Сжатие Bitmap в Android. Скорость работы

Сжатие Bitmap в Android. Скорость работы

У меня программа очень часто берет битмап и переводит его в массив байтов, следующим образом:

302