Может ли вызов free()
сбой каким-либо образом?
Например:
free(NULL);
Может ли вызов free()
сбой каким-либо образом?
Например:
free(NULL);
Освобождение указателя NULL не может потерпеть неудачу. И free
не возвращает никакой ошибки, но освобождение нераспределенной памяти, уже освобожденной памяти или середины выделенного блока - это поведение undefined - это может привести к ошибке памяти, и программа может прерваться (или, что еще хуже, она будет повреждена куча структуры и аварии позже).
Или, что еще хуже, продолжайте работать, но полностью испортите свои данные и напишите их на диск, не понимая: -)
Соответствующей частью стандарта (C99) является раздел 7.20.3.2
:
#include <stdlib.h>
void free(void *ptr);
Функция
free
вызывает освобождение пространства, на которое указываетptr
, то есть доступное для дальнейшего выделения. Еслиptr
- нулевой указатель, никаких действий не происходит. В противном случае, если аргумент не соответствует указателю, ранее возвращенному функциейcalloc
,malloc
илиrealloc
, или если пространство было освобождено вызовомfree
илиrealloc
, поведение undefined.Функция
free
не возвращает значения.
free(NULL)
ничего не делает; free
указателя, который не был выделен одним и тем же распределителем (malloc
, calloc
и т.д.) или уже был освобожден undefined. Поскольку free
возвращает void
, единственный способ, которым это может быть неудачно, - сбой (например, segfault).
Если вы не вызываете поведение undefined (например, "double-free" или пытаетесь выполнить free()
строковый литерал) free()
не может завершиться неудачей.
Да, он может выйти из строя в нескольких ситуациях. Например.
free(NULL);
Вызов free() с нулевым указателем разрешен и не приведет к ошибке - см. free() - Opengroup
Вызов без предварительного указателя free'd обычно приведет к нарушению сегмента и вашей программе.
В зависимости от реализации, free()
может выйти из строя, если есть повреждение памяти, например:
char *p = malloc(1000);
*(p-1)=7;
free(p);
Несмотря на то, что это надуманный пример, подобные вещи могут произойти, запустив конец или начало массива. Первое, что вы можете знать об этом, - это ошибка защиты в free()
.