Если realloc терпит неудачу и возвращает NULL - это бывший буфер free'd или он сохраняется нетронутым? Я не нашел эту конкретную информацию на странице руководства, и я совершенно не уверен, что делать. Если память освобождается, то двойная свобода может быть рискованной. Если нет, произойдет утечка.
Предоставляет ли realloc первый буфер, если он не работает?
Ответ 1
Нет, это не так. Этот аспект часто раздражал меня, поскольку вы не можете просто использовать:
if ((buff = realloc (buff, newsize)) == NULL)
return;
в вашем коде, если вы хотите освободить оригинал при ошибке. Вместо этого вам нужно сделать что-то вроде:
if ((newbuff = realloc (buff, newsize)) == NULL) {
free (buff);
return;
}
buff = newbuff;
Конечно, я понимаю обоснование сохранения первоначального буфера без изменений при неудаче, но мой пример использования достаточно высок, что я обычно кодирую realloc2()
для обработки этого случая, что-то вроде (из памяти):
static void *reallocFreeOnFail (void *oldbuff, size_t sz) {
void *newbuff = realloc (oldbuff, sz);
if (newbuff == NULL)
free (oldbuff);
return newbuff;
}
Соответствующий раздел в стандарте C11 (хотя он также относится к более ранним итерациям) гласит:
7.20.3.4 Функция realloc
Если ptr является нулевым указателем, функция realloc ведет себя как функция malloc для указанный размер. В противном случае, если ptr не соответствует указателю, ранее возвращенному calloc, malloc или realloc, или если пространство было освобождено вызовом для функции free или realloc, поведение undefined. Если память для нового объект не может быть выделен, старый объект не освобождается и его значение не изменяется.
Ответ 2
realloc()
возвращает указатель на вновь выделенную память, которая соответствующим образом выровнена для любой переменной и может отличаться отptr
илиNULL
, если запрос завершился с ошибкой. Еслиsize
было равно 0, то возвращаетсяNULL
или указатель, подходящий для передачи вfree()
. Еслиrealloc()
не работает, исходный блок остается нетронутым; он не освобождается или не перемещается.
Ответ 3
Нет. Никакое изменение прежнего буфера не выполняется, если realloc()
не удалось.
man
realloc(3)
:
realloc()
возвращает указатель на вновь выделенную память, которая соответственно выравнивается для любой переменной и может отличаться отptr
илиNULL
, если запрос не выполняется. Если размер был равен 0, либоNULL
, либо указатель, подходящий для переданный вfree()
. Еслиrealloc()
не удался, исходный блок оставлен нетронутым; он не освобождается или не перемещается.
Ответ 4
Нет. Это не будет. Изменения Realloc увеличивают/уменьшают динамическую память, выделенную через malloc или calloc. Он вернет NULL в случае сбоя realloc при увеличении объема памяти, но не изменит ранее выделенную память. Поскольку Realloc вычисляет новое распределение памяти из базового адреса ранее выделенной памяти, он не выполняет никаких операций в памяти