2017-02-10 7 views
1

Привет, ребята, у меня есть массив функции изменения размера, как этотдвойные свободные или повреждение (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; 
} 

Я звоню эту функцию, как это ..

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

Я получаю двойной бесплатно (fasttop) ошибка в функции перераспределить ..

и аналитический отчет Valgrind говорит

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) 

Пожалуйста, помогите.

ответ

1

прототип вашей функции

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

вы изменяете array в вашей обычной, но она не отражает на абонента, вы изменения копию из array указателя.

Итак, в следующий раз, когда вы вызываете свою рутину, если array был изменен на realloc в какой-то момент, потому что ему нужен был больший размер (не происходит систематически), вы передаете уже освобожденный указатель.

Возможные исправления:

  • возвращение array вместо своего статуса (возвращение NULL при пропадании будет ОК)
  • проход array в time_t **array и относятся к нему как *array в вашей обычной (и коллировать с &array)

(первый вариант проще)

Примечание: остальная часть кода замечательно хорошо написана для обработки ошибок (это ирония предмета)

+0

Не обновлен ли массив. Как это место памяти? – Goutam

+0

массив _copied_ где-то еще (не _moved_, поэтому вы можете поверить, что ваша программа работает на мгновение, это порочная часть). Вы должны экспортировать возвращаемое значение 'realloc' вашему вызывающему абоненту. –

Смежные вопросы