Каково корректное использование перевыделения (), когда оно приводит к сбою и возвращает ПУСТОЙ УКАЗАТЕЛЬ?

Может любой суммировать то, что является корректным использованием realloc()?

Что Вы делаете когда realloc() сбои?

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

Вот пример:

   1.  char *ptr = malloc(sizeof(*ptr) * 50);
   2.  ...
   3.  char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60);
   4.  if (!new_ptr) {
   5.      free(ptr);
   6.      return NULL;
   7.  }

Предположим realloc() сбои на строке 3. Я делаю правильную вещь на строке 5 free()луг ptr?

16
задан Angel Politis 3 May 2017 в 22:47
поделиться

4 ответа

Из http://www.c-faq.com/malloc/realloc.html

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

Следовательно, вам действительно нужно будет освободить ранее выделенную память.

17
ответ дан 30 November 2019 в 22:49
поделиться

Edit: Поправка, некоторые люди ругают меня за то, что я сказал, то, как вы выделили указатель, кажется, является лучшей практикой среди них, меня учили всегда идти с приведением типов в sizeof(), но, очевидно, ваш способ более правильный, так что не обращайте внимания на то, что я сказал =)

Заглянув в http://en.wikipedia.org/wiki/Malloc#realloc раньше, вы могли бы получить некоторую пользу.

Вы не совсем понимаете sizeof() - он имеет значение размера аргумента, который вы ему передаете, в байтах. Например, sizeof(int) будет равен 4 на большинстве 32-битных систем, но вы все равно должны использовать sizeof(int) вместо 4, потому что при компиляции вашего кода на 64-битной системе (просто как пример) это значение будет равно 8, и ваш код все равно будет компилироваться нормально. Для чего вы выделяете память? Указатели? Если да, то вам следует использовать sizeof(void*) (вы можете сказать sizeof(int*), но это обычная конвенция - не упоминать компилятору, что вы хотите хранить в этих указателях, поскольку все указатели должны быть одного размера - поэтому большинство программистов говорят sizeof(void*)), если вам нужно место для символов, используйте sizeof(char) и так далее.

Однако вы правы, если храните возвращаемое значение realloc() в новом указателе и проверяете его, хотя многие программисты полагают, что в системе всегда достаточно памяти, и уходят от ответа.

-3
ответ дан 30 November 2019 в 22:49
поделиться

Это зависит от того, что вы хотите сделать. Когда realloc дает сбой, что вы хотите сделать: освободить старый блок или оставить его живым и неизменным? Если вы хотите освободить его, то освободите его.

Также имейте в виду, что в C89 / 90, если вы сделаете запрос realloc с нулевым целевым размером, функция realloc может вернуть нулевой указатель, даже если исходная память была успешно выполнена. освобожден. Это был дефект в C89 / 90, поскольку не было способа отличить успех от неудачи при возврате нуля.

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

1
ответ дан 30 November 2019 в 22:49
поделиться

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

0
ответ дан 30 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: