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

Как очистить переменную в c

  • автор:

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

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

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

Caesium137
10.05.19 10:54:27 MSK
1 2 →

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

XMs ★★★★★
( 10.05.19 10:56:30 MSK )

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

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 10:56:32 MSK )
Последнее исправление: DELIRIUM 10.05.19 10:58:55 MSK (всего исправлений: 1)

Ответ на: комментарий от XMs 10.05.19 10:56:30 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:00:22 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 10:56:32 MSK

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

Caesium137
( 10.05.19 11:00:26 MSK ) автор топика

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

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

Deleted
( 10.05.19 11:00:32 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:00:32 MSK

static int counter

Caesium137
( 10.05.19 11:01:00 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:00:26 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:01:32 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:01:32 MSK

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

Caesium137
( 10.05.19 11:02:01 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:01:00 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:02:12 MSK )
Ответ на: комментарий от Caesium137 10.05.19 11:01:00 MSK

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

Deleted
( 10.05.19 11:02:22 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:02:12 MSK

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

Caesium137
( 10.05.19 11:02:53 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:02:53 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:03:46 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:03:46 MSK

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

Caesium137
( 10.05.19 11:04:27 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:04:27 MSK

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

Deleted
( 10.05.19 11:06:40 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:06:40 MSK
Caesium137
( 10.05.19 11:07:27 MSK ) автор топика
Ответ на: комментарий от Deleted 10.05.19 11:06:40 MSK

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

Caesium137
( 10.05.19 11:08:31 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:07:27 MSK

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

Deleted
( 10.05.19 11:08:49 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:08:49 MSK

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

Caesium137
( 10.05.19 11:11:17 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:11:17 MSK

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

Deleted
( 10.05.19 11:12:14 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:08:49 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:12:18 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:12:18 MSK

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

Caesium137
( 10.05.19 11:12:58 MSK ) автор топика
Ответ на: комментарий от DELIRIUM 10.05.19 11:12:18 MSK

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

Deleted
( 10.05.19 11:13:12 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:13:12 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:15:34 MSK )
Ответ на: комментарий от Caesium137 10.05.19 11:12:58 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:16:15 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:15:34 MSK
Deleted
( 10.05.19 11:16:43 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:16:43 MSK

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

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.

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:18:54 MSK )

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

anonymous
( 10.05.19 11:20:27 MSK )
Ответ на: комментарий от anonymous 10.05.19 11:20:27 MSK

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

DELIRIUM ☆☆☆☆☆
( 10.05.19 11:22:24 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:22:24 MSK

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

Дополним аналогию. Стул заставлен со всех сторон шкафами. )

Deleted
( 10.05.19 11:23:59 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:23:59 MSK

Шкафы можно отодвинуть)

Как сделать переменную пустой (обнулить)?

Пишу простейшего миллионера, вариантом ответа на вопросы которого является переменная типа Int.

Проблема в том, что отвечая на один вопрос, значение остается и при следующем вопросе
Вопрос — Как сделать ее пустой в опр. месте?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как обнулить переменную типа stringstream
использую stringstream для преобразования переменных в string stringstream sst; sst << 123456;.

Как обнулить переменную
Сам знаю, что вопрос глупый, но никак не могу найти решение. В C# для этого используется ключевое.

Как обнулить переменную после ее обработки
Скажите , как можно удалить после присвоения переменную вот тут. str1 &= If(CType(Controls("Box".

Как обнулить переменную, объявленную в другой форме
Добрый вечер.У меня есть две формы.На первой есть множество э/у и переменная.На второй форме есть.

программист С++
860 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
ruslan_smirnov, лучше выложи код
Регистрация: 01.03.2011
Сообщений: 89

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
if (win == 0){ system("cls"); cout  " ______________________________________________________ "  endl  endl; cout  endl  " Игрок - "  name  endl endl; cout  " Выигрыш - "  win  endl  endl; cout  " ______________________________________________________ "  endl  endl; cout  " Как в быту нередко называют подслушивающее устройство? "  endl endl; cout  " 1. дятел 2. жучок "  endl; cout  " 3. сверчок 4. муха "  endl  endl ; cout  " Ответ: "; cin >> answer; if (answer == 2){ win = 1000; } else{ win = 0; system("cls"); cout  " Ответ неверный! "  endl; cout  " Правильный ответ: 2. жучок "  endl  endl; cout  " Выш выигрыш: "  win  endl  endl;; } } if (win == 1000){ system("cls"); cout  " ______________________________________________________ "  endl  endl; cout  endl  " Игрок - "  name  endl endl; cout  " Выигрыш - "  win  endl  endl; cout  " ______________________________________________________ "  endl  endl; cout  " У кого глаза велики? "  endl endl; cout  " 1. у грусти 2. у радости "  endl; cout  " 3. у смеха 4. у страха "  endl  endl ; cout  " Ответ: "; if (answer == 4) win = 3000; else{ win = 0; system("cls"); cout  " Ответ неверный! "  endl; cout  " Правильный ответ: 4. у страха "  endl  endl; cout  " Выш выигрыш: "  win  endl  endl;; } } }

Переменная answer в первом случае получает значение и использует его на протяжении всей проги, нужно обнулить после первого ввода=)точнее не обнулить, а дать возможность работать с ней и далее, т.е. вводить в качестве ответа.

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

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

Отслеживать
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
задан 27 апр 2017 в 7:00
69 1 1 золотой знак 1 1 серебряный знак 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
218k 15 15 золотых знаков 117 117 серебряных знаков 229 229 бронзовых знаков
А не «умный» компилятор разве не разберётся с автоматическими переменными?
27 апр 2017 в 7:09

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

clear

Эта команда уничтожает переменные, которые не защищены. Она удаляет перечисленные переменные из окружения. Само по себе, без аргументов, clear уничтожает все переменные за исключением переменных, защищённых с помощью predef . Таким образом, две команды predef ( 0 ) и clear уничтожают все переменные.

Обычно защищёнными переменными являются стандартные библиотеки и переменные с префиксом процента.

Обратите внимание на особый синтаксис clear a b c и clear ( ‘ a ‘ , ‘ b ‘ , ‘ c ‘ ) , а не clear ( a , b , c ) . Обратите также внимание на то, что a = [ ] не уничтожает a , а устанавливает a пустой матрицей.

Команда clear может работать с несуществующими переменными, т. е. clear уничтожает несуществующие переменные как если бы они существовали.

Примеры

a=2; b=3; c=4; clear a isdef("a") // F isdef("b") // T clear("b"); isdef("b") // F

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

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