В следующем коде я действительно освобожу память, занятую указателем? Если нет, то как я могу освободить память? Здесь я не хочу, чтобы удалить но указатель. a
int a = 1;
int* p;
p = &a;
p = NULL;
Нет, он просто присваивает значение указателя NULL
.
Для вашего конкретного примера, это выглядит как переменная стека, так что вы не можете a
free
его в любом случае. Вы можете освобождать память, вызывая delete
в памяти, которое выделяется в куче, используя new
.
Что касается вопроса: "Как я могу освободить память", выделенная таким образом память обычно не требуется освобождать. Если вы находитесь внутри функции, память автоматически перерабатывается, когда функция завершается. Если переменная распределена глобально, она никогда не освобождается до конца программы.
Редактировать (ответ на редактирование OP): указатель также выйдет из области действия, если контекст, который он определен в результатах возврата. Вы не можете явно освобождать указатель, если он не был создан с использованием new
.
p
был выделен в куче, просто установка его в NULL вызывает утечку памяти.
malloc
не должен быть задействован.
a
объявляется в стеке, поэтому вам не нужно его освобождать. Вы должны освободить объект, выделенный new
используя delete
.
См. Здесь дополнительную информацию о куче и стеке.
malloc
с free
malloc
и free
.
Переменная a сохраняется в стеке не в динамической памяти, мы освобождаем только память, которая выделяется нами средствами sing malloc, calloc, alloc, а не системой. И память a автоматически удаляется, когда она выходит из сферы действия
Вам нужно free
если и только если у вас есть alloc
.
Поскольку вы только что назначили указателю p
, не выделенному, вам не нужно освобождать.
a
выходит из области видимости