Это зависит от того, что вы имеете в виду: если вы хотите пустой памяти, используемой, но по-прежнему имеют доступ к этой памяти, то вы используете memset(pointer, 0, mem_size);
, чтобы повторно инициализировать указанную память на нулях.
Если вам больше не нужна эта память, вы просто вызываете free(pointer);
, что освободит память, поэтому ее можно использовать в другом месте.
Использование realloc(pointer, 0)
может работать как free
на вашей системе, но это не стандартное поведение. realloc(ptr, 0)
не указывается стандартами C99 или C11 как эквивалент free(ptr)
.
realloc(pointer, 0)
не соответствует free(pointer)
.
Стандарт (C99, §7.22.3.5):
The realloc function
Synopsis
1
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
Description
2 The realloc function deallocates the old object pointed to by ptr and returns a
pointer to a new object that has the size specified by size. The contents of the new
object shall be the same as that of the old object prior to deallocation, up to the lesser of
the new and old sizes. Any bytes in the new object beyond the size of the old object have
indeterminate values.
3 If ptr is a null pointer, the realloc function behaves like the malloc function for the
specified size. Otherwise, if ptr does not match a pointer earlier returned by a memory
management function, or if the space has been deallocated by a call to the free or
realloc function, the behavior is undefined. If memory for the new object cannot be
allocated, the old object is not deallocated and its value is unchanged.
Returns
4
The realloc function returns a pointer to the new object (which may have the same
value as a pointer to the old object), or a null pointer if the new object could not be
allocated.
Как вы можете видеть, это не определяет особый случай перераспределить вызовов, где размер равен 0. Вместо этого, он только утверждает, что указатель NULL возвращается при ошибке выделения памяти и указатель во всех других случаях. Тогда указатель, указывающий на 0 байтов, будет жизнеспособным вариантом.
Цитирую a related question:
Более интуитивно, перераспределить это «концептуально эквивалентны» в таНос + тетсру + бесплатно на другой указатель, и таНос-ки 0 байт блок памяти возвращается либо NULL либо уникальный указатель, который нельзя использовать для хранения чего-либо (вы запросили 0 байтов), но все же освобождаетесь. Итак, нет, не используйте realloc, как это, он может работать на некоторых реализациях (а именно Linux), но это, безусловно, не гарантируется.
В другом ответ на что связанные состояниях вопроса, поведение realloc(ptr, 0)
явно определяются как реализации определяется в соответствии с действующим стандартом C11:
Если размер пространства запрошенным равен нуль, поведение определяется реализацией: возвращается нулевой указатель или поведение такое, как если бы размер был некотором ненулевым значением, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту
Что вы подразумеваете под «пустым»? –