Как освободить указатели в динамическом массиве при сбое realloc?
Возможный дубликат:
Как обрабатывать realloc, когда он выходит из строя из-за памяти?
Допустим, у меня есть массив указателей
char **pointers_to_pChar = 0;
pointers_to_pChar = (char **)malloc(sizeof(char *) * SIZE);
for (i = 0; i < SIZE; ++i)
{
pointers_to_pChar[i] = malloc(sizeof(char) * 100));
}
//some stuff...
//time to realloc
pointers_to_pChar = realloc(pointers_to_pChar, sizeof(char *) * pointer_count + 1);
if (pointers_to_pChar == NULL)
{
//i have to free pointers in the array but i don't have access to array anymore...
}
Как мне справиться с ситуацией, когда происходит сбой realloc? Мне нужно получить доступ к каждому указателю в массиве и освободить их, чтобы избежать возможной утечки памяти.
3 ответа
Решение
Записать результат во временный указатель; если realloc
происходит сбой, оригинальный блок памяти остается без изменений, но он возвращает NULL, поэтому вы теряете указатель на него:
char **tmp = realloc(pointers_to_pChar, ...);
if (!tmp)
{
//realloc failed
}
else
{
pointers_to_pChar = tmp;
}
Сначала вы должны переопределить другой указатель, а затем проверить NULL.
Таким образом, у вас все еще есть доступ к массиву.
Возьми реаллока, увидишь
If realloc() fails the original block is left untouched; it is not freed
or moved.