Повреждение кучи при использовании структуры данных OpenCV - PullRequest
1 голос
/ 10 июля 2011

Я использую OpenCV 2.1 с кодовыми блоками (gcc под mingw). В своем коде я пытаюсь (по какой-то разумной причине) получить прямой доступ к визуализированным данным в структуре данных IplImage. Пожалуйста, обратитесь к фрагменту кода для более подробной информации:

int main(void)
{
    IplImage* test_image = cvLoadImage("test_image.bmp",CV_LOAD_IMAGE_GRAYSCALE);
    int mysize = test_image->height * test_image->widthStep;
    char* imagedata_ptr = NULL;

    int i   =   0;    
    imagedata_ptr = test_image->imageData;

    char* temp_buff = (char *)malloc(sizeof(mysize));
    memcpy(temp_buff,imagedata_ptr,mysize);

    free(temp_buff);
}

Когда я запускаю этот код, он падает. При запуске в режиме отладки он генерирует SIGTRAP из-за повреждения кучи. Сначала я подозревал, что это может быть связано с компилятором, и поэтому попытался запустить тот же код в Visual Studio. Но это все еще падает. Вот почему я чувствую, что это может быть проблема, связанная с OpenCV.

ПРИМЕЧАНИЕ. Других примеров открытия программы нет, это единственный код, который я выполняю, здесь нет потоков и т. Д.

Жду ваших комментариев на том же.

С уважением,

Саурабх Ганди

1 Ответ

6 голосов
/ 10 июля 2011

Вы не выделяете достаточно памяти, это:

char* temp_buff = (char *)malloc(sizeof(mysize))

выделяет только sizeof(int) байтов (вероятно, 4), и это, вероятно, намного меньше, чем вам нужно. Затем memcpy сразу после этого скопирует test_image->height * test_image->widthStep байтов данных в то место, где есть место только для sizeof(int) байтов, и теперь вы набросали всю память и повредили кучу.

Я думаю, вы действительно хотите сказать это:

char *temp_buff = malloc(mysize);

И не приводите возвращаемое значение из malloc, оно вам не нужно и оно может скрывать проблемы.

...