Может ли вызов free () в C когда-либо завершиться неудачей? - PullRequest
24 голосов
/ 15 марта 2011

Может ли звонок на free() каким-либо образом прерваться?

Например:

free(NULL);

Ответы [ 6 ]

32 голосов
/ 15 марта 2011

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

Или, что еще хуже, продолжайте работать, но полностью повредите ваши данные и запишите их на диск, не осознавая: -)

Соответствующая часть стандарта (C99) является секцией 7.20.3.2:

#include <stdlib.h>
void free(void *ptr);

Функция free вызывает освобождение пространства, на которое указывает ptr,то есть сделано доступным для дальнейшего распределения.Если ptr является нулевым указателем, никаких действий не происходит.В противном случае, если аргумент не совпадает с указателем, ранее возвращенным функцией calloc, malloc или realloc, или если пространство было освобождено при вызове free или realloc, поведениеundefined.

Функция free не возвращает значения.

6 голосов
/ 15 марта 2011

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

5 голосов
/ 15 марта 2011

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

2 голосов
/ 15 марта 2011

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

  1. Вы освобождаете что-то, что не было выделено динамически. Например, переменные в стеке
  2. Вы выделяете указатель и пытаетесь освободить указатель + 1
1 голос
/ 15 марта 2011
free(NULL);

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

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

0 голосов
/ 15 марта 2011

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

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

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

...