Освобождает ли reallo c перед попыткой выделить новую память? - PullRequest
0 голосов
/ 06 января 2020

У меня возникли проблемы с моим упражнением - я хочу узнать немного больше о функции reallo c -

Если мы отправим указатель на reallo c, и он не сможет выделить память [возвращает ноль] память, которая раньше была выделена, теперь освобождена? хотя мы потерпели неудачу?

ePointer = (Element*)realloc(stack->content, (sizeof(Element) * capacityOfStack(stack) * 2));

, когда stack->content является указателем курса, если мы потерпели неудачу, теперь имеем ePointer как NULL, тогда stack->content больше не выделяется?

Большое спасибо !!

Ответы [ 4 ]

3 голосов
/ 06 января 2020

Со страницы man для realloc:

    For realloc(), the input pointer is still valid if reallocation failed.
2 голосов
/ 06 января 2020

stack->content все еще действует. В случае сбоя realloc возвращается NULL, но старый блок памяти остается действительным, это интерфейс.

https://en.cppreference.com/w/c/memory/realloc

1 голос
/ 06 января 2020

С man 3 realloc

Если realloc() не пройден, исходный блок остается без изменений; оно не освобождается и не перемещается.

0 голосов
/ 06 января 2020

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

...