Не обязательно.
Часто это происходит так же, как со ссылкой , которую munissor опубликовал , но на странице руководства Mac OS 10.5 написано:
Если размер равен нулю, а ptr не равен NULL, выделяется новый объект минимального размера, а исходный объект освобождается.
Что такое «объект минимального размера»? Ну, любой распределитель хранит некоторую информацию о распределениях, и это занимает место, которое часто выделяется в дополнение к пространству, зарезервированному для пользователя. Предположительно, «объект минимального размера» - это только один из этих заголовков плюс ноль байтов пространства, зарезервированного для пользователя.
Я бы предположил, что это положение присутствует для поддержки реализаций, которые существовали во время стандартизации, и что эти реализации полезны для отладки поведения выделения.
По адресу Комментарии Джонатана
Рассмотрим разницу между
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
.