2016-07-24 10 views
-2

Die folgende load-Funktion versucht, den Inhalt der Datei mit Zeiger file zu laden und den Speicherort unter content und Länge in length zu speichern. Der Code funktioniert gut, aber Valgrind zeigt den Fehler "ungültiges Schreiben bei Freed" und mehrere Speicherverluste bei der Verwendung von realloc.Valgrind zeigt "ungültiges Schreiben der Größe 4 bei fread" und Speicherlecks

Es folgt der Code:

bool load(FILE* file, BYTE** content, size_t* length) { 
    // providing default values to content and length 
    *content = NULL; 
    *length = 0; 

    // initializing buffer to hold file data 
    int size = 512; 
    BYTE* buffer = NULL; 
    buffer = malloc(size); 
    if(buffer == NULL) 
     return false; 

    // bytes_read will store bytes read at a time  
    int bytes_read = 0; 

    // reading 512 bytes at a time and incrmenting writing location by 512 
    // reading stops if less than 512 bytes read 
    while((bytes_read = fread(buffer + size - 512 , 1, 512, file)) == 512) 
    { 
     //increasing the size of 
     size = size + 512; 
     if(realloc(buffer,size) == NULL) 
     { 
      free(buffer); 
      return false; 
     } 
    } 

    // undoing final increment of 512 and increasing the size by bytes_read on last iteration 
    size = size - 512 + bytes_read; 

    // triming buffer to minimum size 
    if(size > 0) 
    { 
     BYTE* minimal_buffer = malloc(size + 1); 
     memcpy(minimal_buffer, buffer, size); 
     minimal_buffer[size] = '\0'; 
     free(buffer);  
     *content = minimal_buffer; 
     *length = size; 
     return true; 
    } 

    return false; 
} 

Antwort

3

Ihr Problem ist hier:

if(realloc(buffer,size) == NULL) 

er den Puffer neu zuweist, aber Sie nicht den neuen Zeiger speichern. Die realloc Funktion könnte einen neuen Speicherbereich zuweisen und die Daten dort kopieren. Es gibt den neuen Zeiger zurück.

Ein wichtiger Hinweis: Weisen Sie den Zeiger, den Sie an die Funktion realloc übergeben, nicht erneut zu, verwenden Sie eine temporäre Variable. Wenn dann realloc fehlschlägt, verlieren Sie nicht den ursprünglichen Zeiger und können sauber bereinigen.

Verwandte Themen