Я попытался освободить память без использования free()
, как показано ниже.
int *ptr = malloc(20);
realloc(ptr, 0);
Это будет работать?
Я попытался освободить память без использования free()
, как показано ниже.
int *ptr = malloc(20);
realloc(ptr, 0);
Это будет работать?
Стандарты языка C в этом отличаются: в C90 передача нулевого размера была такой же, как вызов free
:
Если size равен нулю, память, ранее выделенная в ptr, освобождается, как если бы был сделан вызов free, и возвращается нулевой указатель.
Однако это изменилось в C99:
Если размер равен нулю, возвращаемое значение зависит от конкретной реализации библиотеки: это может быть либо нулевой указатель, либо какое-то другое местоположение, которое не должно разыменовываться.
Обратите внимание, что освобождение больше не является обязательным требованием; ни один из них не возвращает NULL
при передаче нулевого размера.
free()
, так как вы не можете полагаться на realloc(0)
.
- person Oliver Charlesworth; 16.02.2014
free
, когда вы хотите освободить память. Другим следствием этого изменения является то, что если вы не уверены в версии языка C, с которой будет компилироваться ваш код, вам не следует вызывать realloc
с нулевым размером.
- person Sergey Kalinichenko; 16.02.2014
realloc(ptr, 0)
не эквивалентно free(ptr)
Стандарт C11
говорит:
Если размер запрошенного пространства равен нулю, поведение определяется реализацией: либо возвращается нулевой указатель, либо поведение такое, как если бы размер был некоторым ненулевым значением, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту. .
Почему, потому что realloc
делает ниже вещи,
Возможно, но рассчитывать на это нельзя. Из документов:
Если new_size равен нулю, поведение определяется реализацией (может быть возвращен нулевой указатель или может быть возвращен ненулевой указатель, который нельзя использовать для доступа к хранилищу).
По крайней мере, для POSIX: realloc(p, 0)
не совпадает с free(p)
.
Из текущей документации POSIX для realloc()
:
Предыдущие версии явно разрешали вызов realloc (p, 0) для освобождения пространства, на которое указывает p, и возврата нулевого указателя. Хотя такое поведение можно интерпретировать как разрешенное данной версией стандарта, комитет по языку C указал, что такая интерпретация неверна.
recursion
иmarco
? - person alk   schedule 16.02.2014