2017-02-21 3 views
0

Можно создать дубликат: OpenCV double free or corruption (out): Aborted (core dumped)Что вызывает двойную ошибку или коррупцию (out)?

Я создал функцию, которая будет получать изображения от клиента и использовать OpenCV сервер для обработки изображения и возвращать данные. Я понял, что получаю эту ошибку только при использовании функции free(). Ниже приведен код в моей функции.

// 2. Create Mat Image 
Mat image = Mat::zeros(height, width, CV_8UC3); 
uchar sockData[imageSize]; 

//Receive Image data here 
printf("Receiving Image Data\n"); 
for (int i = 0; i < imageSize; i += bytecount) 
{ 
    if ((bytecount = recv(*csock, sockData +i, imageSize - i, 0)) == -1) 
    { 
     fprintf(stderr, "Error receiving image %d\n", errno); 
    } 
} 
// deallocate 
deallocateMemory(csock); 

// Image Data Received, Now Reconstructing Image 
printf("Image Data Received, Now Reconstructing\n"); 
int ptr = 0; 
for (int i = 0; i < image.rows; i++) 
{ 
    for (int j = 0; j < image.cols; j++) 
    { 
     image.at<cv::Vec3b>(i,j) = cv::Vec3b(sockData[ptr+0],sockData[ptr+1], 
     sockData[ptr+2]);ptr = ptr + 3; 
    } 
} 
// Write produced output to stdout - Print 
printf("Image Processed, now Displaying Results...\n"); 
displayResultsOnConsole(results); 

// free(sockData); 
return 0; 

ошибка появляется, когда я раскомментировать free(sockData); ли я делаю что-то неправильно?

+1

'uchar sockData [imageSize];' выделяется стек, поэтому 'free()' терпит неудачу на нем. –

ответ

2

Вы можете только перейти на free точно тот же указатель, который вы получили от malloc (или NULL, который ничего не делает). Вы нарушаете это правило, поэтому происходят плохие вещи.

+0

О, теперь я вижу. Я могу использовать 'free' только когда я использовал' malloc' Спасибо – Les

+1

Правильно или какая-то другая функция, которая выделяет из того же распределителя, как 'strdup' или' realloc'. Распределители памяти подобны библиотекам - вы можете только проверить книгу, которую вы проверили из той же самой библиотеки. –

+0

Получил! Спасибо :-) – Les

1

Uh. Вы выделяете на стек и хотели бы освободиться от кучи?

Вам удалось добавить этот большой кусок, выделенный на стеке? -> Не нужно беспокоиться.

Плохая практика распределения байтов изображения в стеке, потому что это обычно большая. -> Выделить на кучу, освободить от кучи.

+0

Вы так правы. Это было неудачно, когда я использовал изображение с высоким разрешением, как вы и @DavidSchwartz, я использовал «malloc», и все работает нормально. Спасибо :-) – Les

Смежные вопросы