Перейти к содержимому

Как удалить переменную в c

  • автор:

Как очистить память, выделенную для переменной?

Как очистить память, выделенную для переменной в C++?
Есть переменная, которую я больше не буду использовать; как удалить эту переменную, очистив память, которую она занимала?

Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
задан 27 апр 2017 в 7:00
69 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
Почитайте всётаки про malloc — free и new — delete
27 апр 2017 в 7:03
@nick_n_a, мне почему-то кажется, что там ни malloc , ни new не было даже 🙂
27 апр 2017 в 7:05
оТчистить память можно с помощью memset 🙂
27 апр 2017 в 7:11

а вот «почистить memset’ом» не всегда получается. Если после этого память не используется (а она не должна использоваться — мы же делаем зачистку финальную), то компилятор может выбросить memset.

27 апр 2017 в 7:51

@KoVadim я не могу предвосхищать все нюансы в одном сообщении. Более того в комментарии, и ещё более — на довольно сомнительный вопрос ТС.

27 апр 2017 в 8:22

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Вы о статической или динамической?

Если это что-то типа переменной, объявленной в духе string s; — то объявите ее так, чтобы она выходила из области видимости, когда больше не нужна — при выходе будет вызван деструктор, который освободит связанные с переменной ресурсы — типа выделенной ей динамической памяти. Еще раз — освободятся выделенные ресурсы, но не память, выделенная статически под саму переменную.

Если это переменные фундаментальных типов наподобие int i , double d — то не заморачивайтесь: они все равно выделены в стеке (или соответствующем сегменте памяти, если это глобальные переменные или статические переменные функций). Достаточно умный компилятор и так разберется, что с ними делать.

Ну, а с динамическими типа int * p = new int[20000]; — так руками освобождайте память: delete[]p; . Или пользуйтесь интеллектуальными указателями и советом выше.

Отслеживать
ответ дан 27 апр 2017 в 7:07
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
А не «умный» компилятор разве не разберётся с автоматическими переменными?
27 апр 2017 в 7:09

@alexolut Я имею в виду, что если в функции идет использование переменной i , скажем, в первой половине как счетчика цикла, и больше она не используется, а во второй половине — переменная j , и их области использования не пересекаются, то компилятор может использовать для них одну область памяти. Такая оптимизация вполне возможна, кажется, даже в «Книге Дракона — 2» обсуждается. Не очень умный компилятор не станет этим заморачиваться.

C: чтение, добавление, изменение и удаление переменных окружения (getvar, setvar, unsetenv)

Для работы с переменными используются функции getvar() и setvar() из библиотеки stdlib.h .

Как понятно из названий – функция getvar() используется для получения значения переменной, а setvar() – для добавления или изменения.

Для демонстрации – напишем такой код:

#include #include int main () < char *home, *newvar; // получем занчение переменной $HOME home = getenv("HOME"); // Создаём новую переменную $NEWVAR со значением newvarvalue-1 setenv("NEWVAR", "newvarvalue-1", 0); // записываем занчение $NEWVAR в локальную переменную newvar newvar = getenv("NEWVAR"); printf ("Home: %s, and NEWVAR: %sn", home, newvar); // задаём новое значение переменной, но т.к. int replace = 0 - оно не изменится setenv("NEWVAR", "newvarvalue-2", 0); newvar = getenv("NEWVAR"); printf ("NEWVAR: %sn", newvar); // задаём новое значение переменной, но т.к. int replace = 1 - оно изменится setenv("NEWVAR", "newvarvalue-3", 1); newvar = getenv("NEWVAR"); printf ("NEWVAR: %sn", newvar); return 0; >

И результат выполнения:

$ gcc getenv.c -o getenv
$ ./getenv Home: /home/setevoy, and NEWVAR: newvarvalue-1 NEWVAR: newvarvalue-1 NEWVAR: newvarvalue-3

Для удаления переменных – используется функция unsetenv() .

Перепиешм предыдущий код:

#include #include int main () < char *newvar; // Создаём новую переменную $NEWVAR со значением newvarvalue-1 setenv("NEWVAR", "newvarvalue", 0); // записываем занчение $NEWVAR в локальную переменную newvar newvar = getenv("NEWVAR"); if (newvar) < printf ("NEWVAR: %sn", newvar); >else < printf ("NEWVAR not defined: %sn", newvar); >// удаляем переменную $NEWVAR unsetenv ("NEWVAR"); newvar = getenv("NEWVAR"); if (newvar) < printf ("NEWVAR: %sn", newvar); >else < printf ("NEWVAR not defined: %sn", newvar); >return 0; >
$ ./getenv NEWVAR: newvarvalue NEWVAR not defined: (null)

Оператор delete (C++)

Аргумент cast-expression должен быть указателем на блок памяти, ранее выделенный для объекта, созданного с помощью нового оператора. Оператор delete имеет результат типа void и поэтому не возвращает значение. Например:

CDialog* MyDialog = new CDialog; // use MyDialog delete MyDialog; 

Использование delete указателя на объект, не выделенный с new непредсказуемыми результатами. Однако можно использовать delete указатель с значением 0. Эта подготовка означает, что при new возврате 0 при сбое удаление результата неудачной new операции является безвредным. Дополнительные сведения см. в разделе «Новые и удаленные операторы».

delete Операторы new также можно использовать для встроенных типов, включая массивы. Если pointer ссылается на массив, поместите пустые квадратные скобки ( [] ) перед pointer :

int* set = new int[100]; //use set[] delete [] set; 

delete Использование оператора в объекте освобождает память. Программа, которая разыменовывает указатель после удаления объекта, может создать непрогнозируемый результат или вызвать сбой.

Если delete используется для освобождения памяти для объекта класса C++, деструктор объекта вызывается до освобождения памяти объекта (если объект имеет деструктор).

Если операнду оператору delete является изменяемым l-значением, его значение не определено после удаления объекта.

Если указан параметр компилятора /sdl (включение дополнительных проверка безопасности), операнду delete оператору присваивается недопустимое значение после удаления объекта.

Использование оператора delete

Существует два синтактических варианта для оператора удаления: один для отдельных объектов и другой для массивов объектов. В следующем фрагменте кода показано, как они отличаются:

// expre_Using_delete.cpp struct UDType < >; int main() < // Allocate a user-defined object, UDObject, and an object // of type double on the free store using the // new operator. UDType *UDObject = new UDType; double *dObject = new double; // Delete the two objects. delete UDObject; delete dObject; // Allocate an array of user-defined objects on the // free store using the new operator. UDType (*UDArr)[7] = new UDType[5][7]; // Use the array syntax to delete the array of objects. delete [] UDArr; >

В следующих двух случаях возникают неопределенные результаты: использование формы удаления массива ( delete [] ) в объекте и использование неаррейской формы удаления в массиве.

Пример

Примеры использования delete см . в разделе «Новый оператор».

Принцип работы delete

Оператор удаления вызывает удаление оператора функции.

Для объектов не типа класса (класса, структуры или объединения) вызывается глобальный оператор удаления. Для объектов типа класса имя функции deallocation разрешается в глобальных область если выражение удаления начинается с унарного оператора разрешения область ( :: ). В противном случае перед освобождением памяти оператор удаления вызывает деструктор объекта (если указатель не имеет значения null). Оператор удаления можно определять отдельно для каждого класса; если для некоторого класса такое определение отсутствует, вызывается глобальный оператор удаления. Если выражение удаления используется для освобождения объекта класса, статический тип которого имеет виртуальный деструктор, функция освобождение разрешается через виртуальный деструктор динамического типа объекта.

Как «забыть» переменную на c/c++?

Как «забыть» переменную на с/с++? Припустим ты использовал переменную, и она тебе больше нигде не нужна, вопрос: как ее удалить?

  • Вопрос задан более года назад
  • 804 просмотра

Комментировать
Решения вопроса 2
Сергей Горностаев @sergey-gornostaev Куратор тега C
Седой и строгий

Переменные прекращают существование после завершения блока, в котором объявлены. Соответственно, используйте маленькие функции, объявляйте переменные как можно ближе к месту их использования и компилятор обо всём позаботится сам.

Ответ написан более года назад
Комментировать
Нравится 7 Комментировать
skyazimuth @skyazimuth

Во-первых, переменные с модификатором static видны только в модуле в котором объявлены. Хотя, в общем случае, они будут физически храниться всю жизнь программы. Во-вторых, переменные, объявленные внутри блока живут только на время выполнения этого блока, кроме static внутри функции. Грубо говоря, все что внутри фигурных скобок только там и существует. Причем, блок можно создать и в нетипичных местах, например, case 0: или вообще в произвольном месте функции. В-третьих, оптимизатор сам следит за тем, где используется переменная. И если он видит, что дальше в функции переменная не используется, то физически на ее месте в памяти может разместить другую. Но с точки зрения текста программы, конечно, она будет считаться видимой до конца блока.

Ответ написан более года назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос

Войдите, чтобы написать ответ

cpp

  • C++

Не могу, понять как компьютер перемещает свой знак?

  • 1 подписчик
  • 17 часов назад
  • 81 просмотр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *