Как удалить переменную в c
Перейти к содержимому

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

  • автор:

Как сбросить переменную в С#?

Как сбросить переменную? Например, в PHP есть unset($var) функции.

10 ответы

На самом деле нет эквивалента «неустановленному».

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

Переменная по-прежнему будет «установлена», но будет иметь значение по умолчанию.

int[] array1 = new int[] < 1, 3, 5, 7, 9, 10 >; , а затем int array1 = default(int); возвращает >> Локальная переменная с именем ‘array1’ уже определена в этой области — ви

Обращение к приведенному выше комментарию: это потому, что вы повторно объявляете локальную переменную array1 (вы изначально объявляете его как int[] array1 , затем попытайтесь объявить его во второй раз как int array1 ). Предполагая, что вы не собирались менять тип с int[] в int (что невозможно в С#), ваше исправление должно быть: array1 = default(int[]); — рпатель

Вы не можете. Нет понятия «сбросить» переменную. Вы можете установить для него другое значение — 0, null, что угодно. Экземплярные/статические переменные даже не имеют представления о том, установлена ​​ли переменная или нет, а локальные переменные имеют только «определенно назначенные» или «неопределенно назначенные».

Чего вы пытаетесь достичь?

ответ дан 13 окт ’08, 12:10

Наиболее важным использованием unset() в PHP является сброс переменных, которые не определены в области видимости (функция или класс), IMO. Из-за этого C# не нужно сбрасывать, как это делает PHP. 🙂 — вялый

Как правило, установка значения null делает работу (для переменных типов, таких как int, вам нужно будет сделать ее версией с нулевым значением int?).

Если вы хотите использовать переменную только в течение короткого периода времени в более крупной функции, вы можете ограничить ее, например так:

Переменная будет длиться только до закрывающей скобки.

Если они не охватывают ваши обстоятельства, то можете ли вы уточнить, где вам нужно это сделать.

ответ дан 22 дек ’14, 22:12

Может быть, вы хотели бы освободить объект на которую ссылается переменная:

ответ дан 13 окт ’08, 12:10

NB это не гарантирует удаление объекта, к которому MyVar указывал. — Джо

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

Для переменных ссылочного типа вы просто устанавливаете их в нуль и сборщик мусора уничтожит связанный объект (и освободит память). Но обратите внимание, что сама переменная будет продолжать существовать во всей своей области (блок кода, метод, жизнь объекта. )

Если вы хотите использовать это для освобождения памяти, просто установите для всех ненужных объектов значение null и подождите, пока сборщик мусора выполнит свою работу.

Редактировать: Как отмечалось в комментариях, я не сказал, что сборщик мусора не начнет сборку сразу. Обычно это происходит, когда фреймворк пытается выделить память и не может найти достаточно свободной. Запустить сборку мусора «вручную» можно, но это не рекомендуется и может ухудшить поведение программы. Для большинства целей поведения сборщика мусора по умолчанию должно быть достаточно.

ответ дан 13 окт ’08, 13:10

Объект будет уничтожен, как только появится нет переменная, предоставляющая ссылку на нее больше. — вялый

@hangy: Это не так просто. Память объекта будет освобождена только при следующем запуске GC (для этого поколения), а не как только на него не ссылается переменная. Есть и другие сложности, такие как циклические ссылки (не проблема) и финализация. 300 символов мало! — Джон Скит

300 символов мало, да. 🙂 Я только что добавил это, потому что, просто используя ответ rslite, можно подумать, что объект исчез, как только для одной переменной установлено значение null. Вы правы, конечно, это не всегда так просто. — вялый

Сборщик мусора просматривает дерево ссылок от листа (в данном случае это объект, который, возможно, должен быть собран) к корню. Если он не укоренен, он будет собран. Другие, также некорневые объекты могут содержать ссылку, и она все равно будет собрана. — пользователь1228

@Will: Нет, он не переходит от листа к корню. Он использует отметку/разметку, обходя все известные корни и затем собирая все, что не отмечено. Вы не можете перемещаться по листу-> корню — объект не знает, что на него ссылается. — Джон Скит

Чтобы сбросить переменную среды, используйте тот же метод Environment.SetEnvironmentVariable, но передайте null или string.Empty в качестве значения. http://msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx

«Если значение пусто, а переменная среды, названная переменной, существует, переменная среды удаляется».

Удалить переменную в теле программы Си

Я объявляю статическую переменную counter в начале программы в двух первых функциях она нужна, а в третьей она не нужна. Можно ли ее как-то удалить?

Перемещено beastie из general

Во-первых, в development. Во-вторых, Это что, клуб изучения Си?

Статическую нет, выделяй динамически, если переменная — экземпляр большой структуры, если это какой-нибудь int, то ваще забей.

Не, поизвращаться на самом деле можно, это же си, но ты что-то делаешь не так. Зачем тебе её удалять и что ты вообще под этим понимаешь?

Да ладно тебе агриться, с каких пор тут вопросы по сям запрещены?

Чтобы осталось больше памяти

Я объявляю статическую переменную counter в начале программы

Интересно, что ты понимаешь под «объявляю» и «статическую». Как ты понимаешь это физически?

static int counter

Сколько памяти она занимает и сколько у тебя есть? У тебя что, микроконтроллер?

Да, микроконтроллер Arduino

Ты экономишь 4 байта?

Вопрос явно не понят. Что происходит физически?

А почему бы и нет?

Потому, что твоё последнее сообщение весит больше))

Ну, так можно или нет?

Подсказываю: «объявление» — это выделение памяти, где произойдёт это выделение с учётом static?

Это вообще возможно?

Фактически в «теле» процесса. Пока процесс не завершён, ты ничего назад не получишь.

Значит, так сделать нельзя?

Как мне известно, нельзя. Физически не получится.

Ну переписать область в сегменте данных можно.

Можешь дать пример кода?

Ну переписать область в сегменте данных можно.

Так он так и не ответил, что он понимает под освободить. Он видимо хочет переиспользовать память, переписать это и означает.

Нет, гугли. И учти, что это будет системно-зависимо.

Ну тогда ой) вот что я нашёл на со

Assuming you are using gnu tools (gcc, binutils) if you look at the linker scripts the embedded folks use like the gba developers and microcontroller developers using roms (yagarto or devkit-arm for example). In the linker script they surround the segments of interest with variables that they can use elsewhere in their code. For rom based software for example you specify the data segment with a ram AT rom or rom AT ram in the linker script meaning link as if the data segment is in ram at this address space, but also link the data itself into rom at this address space, the boot code then copies the .data segment from the rom to the ram using these variables. I dont see why you couldnt do the same thing to have the compiler/linker tools tell you where stuff is then runtime use those variables to grab the data from memory and save it somewhere to hybernate or shut down and then restore that data from wherever. The variables you use to perform the restore of course should not be part of the .data segment or you trash the variables you are using to restore the segment.

Я поставил стул, чтобы сидеть, когда читаю и ем, но когда сплю, он не нужен. Можно ли его как-то выкинуть?

Не совсем корректная аналогия, стул ты можешь выкинуть хоть в окно в любой момент.

стул ты можешь выкинуть хоть в окно в любой момент.

Как удалить переменную в C++? [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Мне хотелось бы чтобы я мог удалить переменную Y и объявить ее заново.

У меня есть код:

Я пробовал помещать переменную в <> , но тогда она не доступна за ее пределами. Есть ли способы реализовать такое с доступом во всей функции?

Так а в чем проблема с областью видимости < >? Если переменная уже не должна существовать то о каком доступе во всей функции может идти речь? А вообще зачем это? Чтобы запутать и себя и других?

В С/С++ статическая типизация — однажды объявленная переменная не меняет свой тип. Это помогает не допускать ошибок.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.13.43305

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

C++. Операторы new и delete[]. Выделение памяти для структурных переменных, объектов классов, массивов. Инициализация выделенной памяти. Пример перераспределения ранее выделенной памяти

Операторы new и delete[] . Выделение памяти для структурных переменных, объектов классов, массивов. Инициализация выделенной памяти. Пример перераспределения ранее выделенной памяти

Содержание

  • 1. Пример динамического выделения памяти для структурной переменной
  • 2. Пример динамического выделения памяти для объекта класса
  • 3. Как выделить память для массива оператором new ? Общая форма
  • 4. Как освободить память выделенную для массива оператором delete[] ? Общая форма
  • 5. Пример динамического выделения и освобождения памяти для массива указателей на базовый тип
  • 6. Пример выделения памяти для массива структурных переменных и его использование
  • 7. Пример выделения и освобождения памяти для массива объектов. Инициализация массива объектов
  • 8. Как перераспределить память, если нужно динамически увеличить (уменьшить) размер массива? Перераспределение памяти для структур, инициализация структур. Пример

Поиск на других ресурсах:

1. Пример динамического выделения памяти для структурной переменной

Выделение и освобождение памяти для структурной переменной. Пусть дана структура Date , которая имеет следующее описание:

Тогда, чтобы выделить и использовать память для переменной типа struct Date нужно написать приблизительно следующий код:

2. Пример динамического выделения памяти для объекта класса

В примере динамично выделяется память для указателя на объект класса CDayWeek . Пример реализован для приложения типа Console Application .

3. Как выделить память для массива оператором new ? Общая форма

Оператор new может быть использован для выделения памяти для массива. Общая форма оператора new в случае выделения памяти для массива:

  • ptrArray – имя массива, для которого выделяется память;
  • type – тип элементов массива. Тип элементов может быть базовый ( int , float , …) или другой структура, класс и т.п.);
  • size – размер массива (количество элементов).
4. Как освободить память выделенную для массива оператором delete[] ? Общая форма

Для освобождения памяти, выделенной под массив, оператор delete имеет следующую форму использования:

где ptrArray – имя массива, для которого выделяется память.

5. Пример динамического выделения и освобождения памяти для массива указателей на базовый тип

В примере выделяется память для массива указателей на тип float . Затем элементы массива заполняются произвольными значениями. После этого, выделенная память освобождается оператором delete[] .

6. Пример выделения памяти для массива структурных переменных и его использование

В примере демонстрируется выделение и освобождение памяти для массива из 3-х структур типа TStudent . Также продемонстрированы способы доступа к полям заданного элемента в массиве структур.

7. Пример выделения и освобождения памяти для массива объектов. Инициализация массива объектов

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

В вышеприведенном коде, внутренняя переменная в массиве объектов инициализируется значением 1, так как такое значение задано в конструкторе без параметров CMonth()

Этот конструктор выступает инициализатором массива. Однако, в классе реализован еще один конструктор – конструктор с 1 параметром или параметризованный конструктор. Согласно синтаксису C++, массив объектов не может быть инициализирован параметризованным конструктором. Поэтому, в классе CMonth обязательно должен быть реализован конструктор без параметров.

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

Вывод: если нужно выделить память для массива объектов некоторого класса, то этот класс обязательно должен иметь реализацию конструктора без параметров.

8. Как перераспределить память, если нужно динамически увеличить (уменьшить) размер массива? Перераспределение памяти для структур, инициализация структур. Пример

В примере демонстрируется процесс перераспределения памяти для типа структуры DayWeek . Выделение и перераспределение памяти динамически есть основным преимуществом этого способа по сравнению со статическим выделением памяти. Память в программе можно выделять когда нужно и сколько нужно.

В структуре DayWeek реализован конструктор без параметров (по умолчанию), который инициализирует массив структур значением по умолчанию ( d =1).

В функции main() сначала выделяется память для массива из 5 структур. Затем эта память перераспределяется для массива из 7 структур. Для этого используется дополнительный указатель p2 .

При перераспределении сначала память выделяется для p2 (7 элементов). Затем копируются данные из p в p2 . После этого освобождается память, которая была выделена для указателя p (5 элементов).

На следующем шаге значение p устанавливается равным значению p2 . Таким образом, оба указателя указывают на одну и ту же область памяти.

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

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