2017-02-07 9 views
2

Ich wundere mich, warum dieser kleine Code-Frieden undichte Speicher verloren geht? Es dreht mein Bild horizontal und gibt das struct Image an meine Hauptdatei zurück.Warum verliert der Code Speicher?

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); 
} 

Nichts sollte in der Hauptdatei falsch sein, weil alle meine anderen Funktionen sind wohlauf ... Aber hier ist der Friede des Hauptes welches das Senden und Zurückführen die Struktur zur Funktion:

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

und die Hauptdatei endet mit:

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

getchar(); 
return 0; 

doch was ich bemerkt habe ist, dass die Höhe und Breite Swap ein Teil des Problems ist, aber ich weiß, wie nicht ich in der Lage sein, dies zu tun, ohne ein Swa p.

+5

Sie verwenden 'malloc' auf den' tmp-> Pixel [i] ', aber am Ende, Sie tun' frei (IMG-> Pixel [i]) 'statt' frei (tmp -> Pixel [i]) '. Wenn Sie am Ende "tmp" freigeben, gehen alle zugeordneten Pixel auf "tmp" verloren. Könnte das das Problem sein? –

+2

Sie sollten lesen [Muss ich das Ergebnis von malloc werfen?] (Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Stargateur

+0

Natürlich spiegelt das Austauschen der Pixelwerte die Bild. Versuchen Sie es auf Papier mit einem 3x2-Pixel-Array mit Werten wie "a" bis "f". –

Antwort

3

Sie haben img geändert, indem Sie deren Höhe und Breite vertauscht haben.

Wenn Sie jedoch img sind die Freisetzung um Platz zu machen für die tmp Pixel, Sie sind zu befreien img im Anschluss an die tmp s Höhe. Das heißt, Sie verwenden img s neue Höhe statt seiner ursprünglichen Höhe.

Um zu beheben, ändern Sie Ihre Schleife zu frei mit img s Breite (die seine alte Höhe ist).

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

@DavidSchwartz Er ersetzt 'img-> pixels' mit' tmp-> pixels' nachdem er 'img-> pixels' freigegeben hat. Er tauscht sie nicht bevor er sie befreit. So befreit er die falschen, richtig? –

+0

Ja, es funktioniert Danke, ich kann nicht glauben, dass es so einfach war ... – Henke

+0

@DavidSchwartz's Vorschlag ist auch gut – jxh

Verwandte Themen