2017-02-10 6 views
1

Hallo Jungs habe ich eine Array-Funktion wie dieseDoppel frei oder Korruption (fasttop)

int 
add_time_element (time_t *array, time_t element, size_t *size) 
{ 
    if (NULL == array) 
    { 
     return STATUS_FAIL; 
    } 

    int status = STATUS_SUCCESS; 
    time_t *tmp = NULL; 
    size_t local_size; 

    (*size)++; 
    local_size = *size; 

    printf ("Local size %lu\n", local_size); 

    tmp = realloc (array, local_size * sizeof (time_t)); 
    if (NULL == tmp) 
    { 
     status = STATUS_FAIL; 
    } 
    else 
    { 
     array = tmp; 
    } 

    if (STATUS_FAIL == status) 
    { 
     (*size)--; 
    } 
    else 
    { 
     array[local_size - ONE] = element; 
    } 

    return status; 
} 

Ändern der Größe ich diese Funktion wie folgt nenne ..

time_t *dates = NULL; 
    dates = malloc (ONE); 
    for (slot_index = ZERO; slot_index < data_provider->n_slots; slot_index++) 
    { 
     printf ("Testing\n"); 
     /*slot = data_provider->slots[slot_index]; 
     date = get_date (slot->start_time);*/ 
     date += ONE;  
     if (STATUS_FAIL == add_unique_time_element (dates, date, &n_dates)) 
     { 
      free (dates); 
      dates = NULL; 
      return STATUS_FAIL; 
     } 
    } 

ich die doppelte frei bekommen (fasttop) Fehler in realloc Funktion ..

Und Bericht valgrind Analyse sagt

Invalid free()/delete/delete[]/realloc() 
==22491== at 0x4C2DD9F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==22491== by 0x402BA3: add_time_element (array_util.c:353) 
==22491== by 0x402C6C: add_unique_time_element (array_util.c:399) 
==22491== by 0x401F92: create_dates (data_provider.c:283) 
==22491== by 0x401D7D: create_data_provider_file (data_provider.c:174) 
==22491== by 0x4075CC: main (data_provider_test.c:13) 
==22491== Address 0x5b63170 is 0 bytes inside a block of size 1 free'd 
==22491== at 0x4C2DD9F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==22491== by 0x402BA3: add_time_element (array_util.c:353) 

Bitte helfen Sie.

Antwort

1

der Prototyp Ihrer Funktion ist

int add_time_element (time_t *array, time_t element, size_t *size)

Sie array in Ihrer Routine sind zu ändern, aber es spiegelt nicht auf den Anrufer, du bist eine Kopie des array Zeiger zu ändern.

So, das nächste Mal, wenn Sie Ihre Routine aufrufen, wenn array wurde von realloc irgendwann geändert, weil es mehr Größe (nicht systematisch) benötigt, übergeben Sie einen bereits freigegebenen Zeiger.

Mögliche Korrekturen:

  • Rückkehr array statt Ihren Status (Rückkehr NULL wenn OK wäre ausfällt)
  • Pass array als time_t **array und bezeichnen es als *array in Ihrer Routine (und rufen mit &array)

(erste Alternative ist einfacher)

Hinweis: Der Rest Ihres Codes ist bemerkenswert gut geschrieben gegen Fehlerbehandlung (das ist die Ironie der Sache)

+0

Ist das Array nicht aktualisiert. Wie ist es ein Speicherort? – Goutam

+0

das Array ist _copied_ woanders (nicht _moved_, so dass Sie glauben, dass Ihr Programm für einen Moment funktioniert, das ist der bösartige Teil). Sie müssen den Rückgabewert von 'realloc' an Ihren Aufrufer exportieren. –

Verwandte Themen