Может ли вызов 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().