C - Если используется realloc, это бесплатно?

При использовании realloc автоматически освобождается память? Или нужно использовать бесплатно с realloc? Что из перечисленного верно?

//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));

//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;

Ответы

Ответ 1

Неправильно. realloc() может возвращать указатель на вновь выделенную память или NULL при ошибке. Что вам нужно сделать, это проверить возвращаемое значение:

ptr1 = realloc(ptr2, 3 * sizeof(int));
if (!ptr1) {
    /* Do something here to handle the failure */
    /* ptr2 is still pointing to allocated memory, so you may need to free(ptr2) here */
}

/* Success! ptr1 is now pointing to allocated memory and ptr2 was deallocated already */
free(ptr1);

Ответ 2

После ptr1 = realloc(ptr2, 3 * sizeof(int)); ptr2 недействителен и не должен использоваться. Вам нужно освободить только ptr1. В некоторых случаях возвращаемое значение realloc будет тем же значением, которое вы передали.

Вы можете смело считать ptr1=realloc(ptr2, ... эквивалентом этого:

ptr1 = malloc(...);
memcpy(ptr1, ptr2, ...);
free(ptr2);

Это то, что происходит в большинстве случаев, если новый размер не поместится в старый блок памяти - тогда realloc может вернуть исходный блок памяти.

В качестве других функций выделения realloc возвращает NULL, если он терпит неудачу, вы можете проверить это.

Ответ 3

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

Ответ 4

Согласно http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/, realloc возвращает новый блок памяти, если перераспределение выполнено успешно, сохраняет исходный блок памяти, если нет. Стандартное использование будет выглядеть так:

ptr2 = realloc(ptr1, new_size);
if (ptr2 == NULL) {
   //ptr1 still contains pointer to original array
} else {
   //ptr2 contains new array, ptr1 is invalid
}

Ответ 5

В обеих ситуациях ptr1 должен быть освобожден.

Ситуация B более сложна, потому что ptr2 потенциально указывает на освобожденное пространство. Или нет. Это зависит от того, можно ли перераспределить его. ptr2 не следует использовать после realloc в B.