Что произойдет, если я повторно выделю и новый размер будет равен 0.Эквивалентно ли это бесплатному?

StackOverflow https://stackoverflow.com/questions/2546572

  •  23-09-2019
  •  | 
  •  

Вопрос

Учитывая следующий код:

int *a = NULL;
a = calloc(1, sizeof(*a));
printf("%d\n", a);
a = realloc(a, 0);

printf("%d\n", a);
return (0);

Он возвращается:

4078904
0

Является ли это перераспределение эквивалентным свободному ?

ПРИМЕЧАНИЕ:Я использую MinGW под WindowsXP.

Это было полезно?

Решение

Не обязательно.

Это часто происходит так же, как с ссылка, которую опубликовал муниссор, но на справочной странице Mac OS 10.5 написано:

Если размер равен нулю, а ptr не равен НУЛЮ, выделяется новый объект минимального размера, а исходный объект освобождается.

Что такое "объект минимального размера"?Что ж, любой распределитель хранит некоторую информацию о выделениях, и это занимает пространство, которое часто выделяется в дополнение к пространству, зарезервированному для пользователя.Предположительно, "объект минимального размера" - это всего лишь один из этих заголовков плюс ноль байт пространства, зарезервированного для пользователя.

Я бы предположил, что это положение присутствует для поддержки реализаций, которые существовали на момент стандартизации, и что эти реализации полезны для отладки поведения распределения.


Для решения Комментарии Джонатана

Рассмотрим разницу между

for (int i=0; i<VERY_BIG_NUMBER; ++i){
  char *p = malloc(sizeof(char[10]));
  free(p);
}

и

for (int i=0; i<VERY_BIG_NUMBER; ++i){
  char *p = malloc(sizeof(char[10]));
  realloc(p,0);
}

При разумной реализации malloc и free первый клип делает не потребляйте память без ограничений.Но если realloc реализация возвращает те "объекты минимального размера", которые она могла бы.

Конечно, этот пример надуманный и он основан на понимании того, что подразумевается под "объектом минимального размера", но я думаю, что текст допускает это.

Короче говоря, если вы подлый free вы должны сказать free.

Другие советы

Это может быть эквивалентно вызову, а может и не быть free на указателе;результат определяется реализацией.

Из стандарта C99 (§7.20.3/1):

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

Это относится ко всем функциям управления памятью, включая realloc.

ДА

Стандарт C99 §7.20.3.4 (перераспределение) гласит:

Функция realloc освобождает старый объект, на который указывает ptr, и возвращает указатель на новый объект, размер которого задан параметром size.Содержимое нового объекта должно быть таким же, как у старого объекта до освобождения, с точностью до меньшего из нового и старого размеров.Любые байты в новом объекте, превышающие размер старого объекта, имеют неопределенные значения.

Если ptr является нулевым указателем, функция realloc ведет себя подобно функции malloc для указанного размера .В противном случае, если ptr не соответствует указателю, ранее возвращенному функцией calloc, malloc или realloc, или если пространство было освобождено вызовом для функции free или realloc поведение не определено.Если память для нового объект не может быть выделен, старый объект не освобождается, и его значение остается неизменным.

Это четко указывает на то, что старый объект освобожден.Возвращаемым значением может быть нулевой указатель, или это может быть значение, указанное в общих примечаниях к §7.20.3:

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

В любом случае, вы не можете разыменовать возвращаемое значение:это могло бы быть использовано в качестве аргумента для free(), или передается другим функциям до тех пор, пока они, в свою очередь, не ссылаются на него.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top