双重释放或腐败(fasttop)
问题描述:
好家伙我有一个数组大小调整功能,这样双重释放或腐败(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)在realloc函数错误..
而且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)
请帮忙。
答
你的函数的原型是
int add_time_element (time_t *array, time_t element, size_t *size)
你在你的日常变化array
,但它并不反映来电,您要更改array
指针的副本。
所以,下次你打电话给你的程序中,如果array
已经realloc
在某些时候被改变,因为它需要更多的大小(没有系统发生),你传递一个已经释放的指针。
可能的修正:
- 回报
array
代替你的地位 - 通
array
为time_t **array
,并把它称为*array
在你的程序中(失败将是OK返回NULL
)(与&array
调用)
(第一替代方案是简单)
注意:你的代码的其余部分对错误处理写得非常好(这是对事物的讽刺)
数组未更新。因为它是一个内存位置? – Goutam
这个数组在另一个地方是_copied_(不是_moved_,所以你可能会认为你的程序工作了一会儿,这是非常恶劣的部分)。您必须将'realloc'的返回值导出到您的调用者。 –