2017-02-07 7 views
2

Мне интересно, почему этот маленький мир кода протекает в памяти? Он переворачивает изображение по горизонтали и возвращает структурное изображение в мой основной файл.Почему происходит утечка кода?

void turnImg(Image *img) { 

    Image *tmp = (Image*)malloc(sizeof(Image)); 

    //swapping size between height and width 
    tmp->height = img->height; 
    img->height = img->width; 
    img->width = tmp->height; 

    //The loop is swapping every pixel from the "last" pixel to the "first" into a tmp 
    tmp->pixels = (Pixel**)malloc(sizeof(Pixel*)*img->height); 
    for (unsigned int i = 0; i < img->height; i++) { 
     tmp->pixels[i] = (Pixel*)malloc(sizeof(Pixel)*img->width); 
     for (unsigned int j = 0; j < img->width; j++) { 
      tmp->pixels[i][j] = img->pixels[img->width - 1 - j][img->height - 1 - i]; 
     } 
    } 

    for (unsigned i = 0; i < img->height; i++) { 
     free(img->pixels[i]); 
    } 
    free(img->pixels); 
    //tmp gives back the pixels to img, but they are now flipped 
    img->pixels = tmp->pixels; 

    free(tmp); 
} 

Ничто не должно быть неправильно в главном файле, потому что все мои другие функции делают хорошо ... Но вот мир основной, который посылает и возвращения к-структуру функции:

case 5: 
     //Flipping the image on its diagonal. 
     printf("Flipping the image on its diagonal..."); 
     turnImg(&plain); 
     printf("Image flipped.\n"); 
     break; 

и главный файл заканчивается:

for (unsigned int i = 0; i < plain.height; i++) { 
    free(plain.pixels[i]); 
} 
free(plain.pixels); 

getchar(); 
return 0; 

Тем не менее, то, что я заметил, что высота и ширина замены является частью проблемы, но я не знаю, как я буду в состоянии сделать это без swa п.

+5

Вы используете 'malloc' на' из tmp-> пикселей [я] ', но в конце концов, вы делаете' свободный (img-> пикселей [I]) 'вместо' свободный (TMP -> пикселей [я]) '. Когда вы освобождаете 'tmp' в конце, все выделенные пиксели на' tmp' теряются. Возможно, это проблема? –

+2

Вы должны прочитать [Я делаю результат malloc?] (Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Stargateur

+0

Конечно, замена значений пикселей отражает образ. Попробуйте это на бумаге с матрицей размером 3 × 2 со значениями, указанными 'a'' 'f'. –

ответ

3

Вы изменили img путем замены его высоты и ширины.

Однако, когда вы освободив img, чтобы освободить место для tmp пикселей, вы освободив img следующим в tmp сек высоты. То есть вы используете новую высоту img, а не ее первоначальную высоту.

Чтобы исправить, измените свой цикл на свободный, используя img s ширину (которая является его старой высотой).

for (unsigned i = 0; i < img->width; i++) { 
     free(img->pixels[i]); 
    } 
+0

@DavidSchwartz Он заменяет 'img-> pixels' с' tmp-> pixels' после того, как он освободит 'img-> pixels'. Он не заменяет их, прежде чем освободит их. Таким образом, он освобождает неправильных, не так ли? –

+0

Да, он работает Спасибо. Я не могу поверить, что это было так просто ... – Henke

+0

@ Предложение DavidSchwartz тоже хорошее. – jxh

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