Действительно освобождает (ptr), где ptr является ПУСТОЙ поврежденной памятью?

Теоретически я могу сказать это

free(ptr);
free(ptr); 

повреждение памяти, так как мы освобождаем память, которая была уже освобождена.

Но что, если

free(ptr);
ptr=NULL;
free(ptr); 

Поскольку ОС будет вести себя неопределенным способом, я не могу получить фактический теоретический анализ для этого о том, что происходит. Независимо от того, что я делаю, это повреждение памяти или нет?

Действительно ли освобождением является допустимый Нулевой указатель?

105
задан Prasoon Saurav 7 September 2010 в 14:53
поделиться

8 ответов

7.20.3.2 Функция free

Краткое содержание

 #include  
пусто бесплатно (void * ptr); 

Описание

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

См. ISO-IEC 9899 .

При этом, глядя на различные кодовые базы в дикой природе, вы: Я могу заметить, что люди иногда делают:

if (ptr)
  free(ptr);

Это потому, что некоторые среды выполнения C (я точно помню, что это было в PalmOS) вылетали при освобождении указателя NULL .

Но в настоящее время я считаю, что это можно с уверенностью предположить, что свободный (NULL) является ошибкой в ​​соответствии с инструкциями стандарта.

211
ответ дан 24 November 2019 в 03:56
поделиться

Если ptr равен NULL, никакая операция не выполняется.

говорит в документации.

12
ответ дан 24 November 2019 в 03:56
поделиться

Все совместимые со стандартами версии библиотеки C трактуют free (NULL) как неработающие.

Тем не менее, когда-то были некоторые версии free, которые вылетали из-за free (NULL), поэтому вы можете увидеть рекомендуют некоторые методы защитного программирования:

if (ptr != NULL)
    free(ptr);
20
ответ дан 24 November 2019 в 03:56
поделиться
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

Вы можете безопасно удалить ПУСТОЙ указатель. В этом случае никакая операция выполняться не будет. Другими словами, free () ничего не делает с указателем NULL.

8
ответ дан 24 November 2019 в 03:56
поделиться

Рекомендуемое использование:

free(ptr);
ptr = NULL;

См.:

man free

     The free() function deallocates the memory allocation pointed to by ptr.
     If ptr is a NULL pointer, no operation is performed.

Когда вы устанавливаете указатель на NULL после free () , вы можете позвонить по free () снова, и никакие операции выполняться не будут.

8
ответ дан 24 November 2019 в 03:56
поделиться

free (NULL) совершенно допустимо в C, а также delete (void *) 0 и delete [] (void *) 0 допустимы в C ++.

Кстати, двойное освобождение памяти обычно вызывает какую-то ошибку времени выполнения, поэтому ничего не повреждает.

6
ответ дан 24 November 2019 в 03:56
поделиться

не повреждение памяти, но поведение зависит от реализации. По стандарту это должен быть юридический код.

0
ответ дан 24 November 2019 в 03:56
поделиться

Я помню, как работал на PalmOS, где free(NULL) разбился.

.
10
ответ дан 24 November 2019 в 03:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: