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üssteHabe 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.