Как освободить указатели в динамическом массиве при сбое 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.
Другие вопросы по тегам