Trotz free nicht völlig freigegeben



  • Ich programmier mir grade nen bitmap loader nur leider leakt der memory
    Direkt nachdem das Programm gestartet wird belegt es meist 424 kbyte Ram, nach dem ersten Drücken der Eingabetaste 1352 kbyte und beim zweiten mal 1152 kbyte (laut Task Manager unter Windows 7 64 Bit, compiled mit Dev-Cpp), obwohl der Speicher durch "free" eigentlich wieder freigegeben sein müsste

    Habe grade erst mit C angefangen, bin also für alle Verbesserungsvorschläge, die nicht mit dem Hauptproblem zusammenhängen, ebenfalls offen 🙂

    #include <stdio.h>
    #include <windows.h>
    
    struct IMAGE{
        unsigned int width;
        unsigned int height;
        unsigned int *data;//RGB
    };
    
    void LoadBMP(struct IMAGE *image, char *filename){
        FILE *bitmap = fopen(filename, "rb");//rb = read bitwise
    
        struct tagBITMAPFILEHEADER bitMapFileHeader;
        struct tagBITMAPINFOHEADER bitMapInfoHeader;
        unsigned int height, width, depth, red=0, green=0, blue=0;
    
        fread(&bitMapFileHeader, 1, sizeof(bitMapFileHeader), bitmap);//read file header
        fread(&bitMapInfoHeader, 1, sizeof(bitMapInfoHeader), bitmap);//read info header
        fseek(bitmap, bitMapFileHeader.bfOffBits, SEEK_SET);//goto start of bitmap data
    
        image->width  = bitMapInfoHeader.biWidth;
        image->height = bitMapInfoHeader.biHeight;
        image->data = malloc(image->width * image->height * sizeof(unsigned int));//allocate memory
    
        for (height = 0; height<image->height; height++){
            depth = (image->height-1) - height;//reverse bitmap 'cause it's upside down
            for (width = 0; width<image->width; width++){
                fread(&blue,  1, 1, bitmap);//read blue
                fread(&green, 1, 1, bitmap);//read green
                fread(&red,   1, 1, bitmap);//read red in this order
                image->data[width + depth*image->width] = (red<<16 | green<<8 | blue);//write data
            }
        }
        fclose(bitmap);
    }
    
    int main(){
        int i, n = 10000;
        struct IMAGE image[n];
        char buffer[256];
        gets(buffer);//to wait so I can check the memory consumption
    
        for (i=0; i<n;i++){
            LoadBMP(&image[i], "line.bmp");
        }
        //line goes like \ (topleft to bottomright)
        //now image[0].data[0] is 0 because it's a black pixel
        //data[1] is white and therefore 256^3 (256 per color and it's rgb)
    
        gets(buffer);
    
        for (i=0; i<n;i++){
            free(image[i].data);
        }
    
        gets(buffer);
        return 0;
    }
    

    Vielen Dank im Voraus



  • Deine Beobachtungen reichen nicht aus, um Leaks zu bestätigen. Dafür gibt es Extrawerkzeuge, z.B. valgrind.
    Ich sehe erstmal keine Leak-Kandidaten.
    Auch solltest du stets die Rückgabewerte der aufgerufenen Funktionen für Fehlerbehandlung auswerten, ebenso red/green/blue als unsigned char definieren, sonst gibts Ärger bei Bigendian.


Anmelden zum Antworten