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.