Подтвердить что ты не робот

Может ли вызов free() в C никогда не работать?

Может ли вызов free() сбой каким-либо образом?

Например:

free(NULL);
4b9b3361

Ответ 1

Освобождение указателя 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 не возвращает значения.

Ответ 2

free(NULL) ничего не делает; free указателя, который не был выделен одним и тем же распределителем (malloc, calloc и т.д.) или уже был освобожден undefined. Поскольку free возвращает void, единственный способ, которым это может быть неудачно, - сбой (например, segfault).

Ответ 3

Если вы не вызываете поведение undefined (например, "double-free" или пытаетесь выполнить free() строковый литерал) free() не может завершиться неудачей.

Ответ 4

Да, он может выйти из строя в нескольких ситуациях. Например.

  • Вы освобождаете то, что не было распределено динамически. переменные в стеке
  • Вы выделяете указатель и пытаетесь освободить указатель + 1

Ответ 5

free(NULL);

Вызов free() с нулевым указателем разрешен и не приведет к ошибке - см. free() - Opengroup

Вызов без предварительного указателя free'd обычно приведет к нарушению сегмента и вашей программе.

Ответ 6

В зависимости от реализации, free() может выйти из строя, если есть повреждение памяти, например:

char *p = malloc(1000);
*(p-1)=7;
free(p);

Несмотря на то, что это надуманный пример, подобные вещи могут произойти, запустив конец или начало массива. Первое, что вы можете знать об этом, - это ошибка защиты в free().