Теоретически я могу сказать это
free(ptr);
free(ptr);
повреждение памяти, так как мы освобождаем память, которая была уже освобождена.
Но что, если
free(ptr);
ptr=NULL;
free(ptr);
Поскольку ОС будет вести себя неопределенным способом, я не могу получить фактический теоретический анализ для этого о том, что происходит. Независимо от того, что я делаю, это повреждение памяти или нет?
Действительно ли освобождением является допустимый Нулевой указатель?
7.20.3.2 Функция
free
Краткое содержание
#include
пусто бесплатно (void * ptr); Описание
Функция
free
вызывает освобождение пространства, на которое указываетptr
, т. Е. Освобождение доступны для дальнейшего размещения. Еслиptr
является нулевым указателем, никаких действий не происходит.
См. ISO-IEC 9899 .
При этом, глядя на различные кодовые базы в дикой природе, вы: Я могу заметить, что люди иногда делают:
if (ptr)
free(ptr);
Это потому, что некоторые среды выполнения C (я точно помню, что это было в PalmOS) вылетали при освобождении указателя NULL
.
Но в настоящее время я считаю, что это можно с уверенностью предположить, что свободный (NULL)
является ошибкой в соответствии с инструкциями стандарта.
Если ptr равен NULL, никакая операция не выполняется.
говорит в документации.
Все совместимые со стандартами версии библиотеки C трактуют free (NULL) как неработающие.
Тем не менее, когда-то были некоторые версии free, которые вылетали из-за free (NULL), поэтому вы можете увидеть рекомендуют некоторые методы защитного программирования:
if (ptr != NULL)
free(ptr);
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
Вы можете безопасно удалить ПУСТОЙ указатель. В этом случае никакая операция выполняться не будет. Другими словами, free () ничего не делает с указателем NULL.
Рекомендуемое использование:
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 ()
снова, и никакие операции выполняться не будут.
free (NULL)
совершенно допустимо в C, а также delete (void *) 0
и delete [] (void *) 0
допустимы в C ++.
Кстати, двойное освобождение памяти обычно вызывает какую-то ошибку времени выполнения, поэтому ничего не повреждает.
не повреждение памяти, но поведение зависит от реализации. По стандарту это должен быть юридический код.
Я помню, как работал на PalmOS, где free(NULL)
разбился.