Подтвердить что ты не робот

Предоставляет ли realloc первый буфер, если он не работает?

Если realloc терпит неудачу и возвращает NULL - это бывший буфер free'd или он сохраняется нетронутым? Я не нашел эту конкретную информацию на странице руководства, и я совершенно не уверен, что делать. Если память освобождается, то двойная свобода может быть рискованной. Если нет, произойдет утечка.

4b9b3361

Ответ 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() не работает, исходный блок остается нетронутым; он не освобождается или не перемещается.

malloc(3) - страница руководства Linux

Ответ 3

Нет. Никакое изменение прежнего буфера не выполняется, если realloc() не удалось.

man realloc(3):

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

Ответ 4

Нет. Это не будет. Изменения Realloc увеличивают/уменьшают динамическую память, выделенную через malloc или calloc. Он вернет NULL в случае сбоя realloc при увеличении объема памяти, но не изменит ранее выделенную память. Поскольку Realloc вычисляет новое распределение памяти из базового адреса ранее выделенной памяти, он не выполняет никаких операций в памяти