it-roy-ru.com

Свободно ли (ptr) где ptr NULL повреждена память?

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

free(ptr);
free(ptr); 

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

Но что, если

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

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

Является ли освобождение указателя NULL допустимым?

101
Vijay

7.20.3.2 Функция free

Конспект

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

Описание

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

Смотрите ISO-IEC 9899 .

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

if (ptr)
  free(ptr);

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

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

208
Gregory Pakosz

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

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

if (ptr != NULL)
    free(ptr);
19
R Samuel Klatchko

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

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

11
Michael Krelin - hacker

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

10
jlru
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

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

8
Prasoon Saurav

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

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
stefanB

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

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

6
n0rd

free (ptr) - это сохранение в C, если ptr равно NULL, однако большинство людей не знают, что NULL не обязательно должен быть равен 0. У меня есть хороший пример старой школы: на C64, по адресу 0, есть такое IO-порт Если вы написали программу на C, обращающуюся к этому порту, вам понадобится указатель, значение которого равно 0. Тогда отвечающая за ядро ​​библиотека c должна будет различать 0 и NULL.

С уважением

2
andi8086

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

0
Pavel Radzivilovsky