С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
#1

два мелких вопроса на счет переменных - C++

17.09.2009, 22:08. Просмотров 1133. Ответов 19

у меня возник такой вопрос: скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю?

===========================

еще один вопрос на счет переменных,в кИр увидел такой код,коды то есть
C++
1
2
3
4
int main()
int char;
int x;
{...}
как это пнять?Что это такое и почему компилятор находит тут ошику?
буду рад ответам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2009, 22:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос два мелких вопроса на счет переменных (C++):

3 мелких вопроса - C++
1. Если в базовом классе объявлена переменная с каким-то именем, то в производных классах такого имени не должно встречаться? 2. Если в...

Два вопроса - C++
1)Мне надо запустить программу, нажимаю run и вместо того чтобы выдать мне расчеты экран мигает и и ничего не происходит. Мне говорили,...

Два вопроса - C++
1) Создать тип перечисления (перечень) MyType, который состоит из констант А=1,В=2,С=5 2)За декларируйте класc Student, которое будет...

Два вопроса от новичка - C++
Здравствуйте, читаю книгу Прата С. (5 издание), помогите: Почему эта программа после выполнения закрывается, если ввести строку где...

Два вопроса по циклу for - C++
1. Нужно два условия и два модификатора в цикле for. Правильно ли я делаю? for (int j=0, k=0; j<n && k<m; j++, k++) { //Работа цикла ...

Два вопроса: структура и файл - C++
1. Записать в файл f1 строку, затем в файл f2 записать символы, которые не повторяются в f1 (например: dsddsrt получаем в f2: rt). ...

19
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 22:17 #2
Цитата Сообщение от МедведЪ Посмотреть сообщение
скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
С помощью return ты передаешь управление вызвавшему процессу, а переменная х (как и y, z, и прочее что там было определено) уничтожается при выходе из области видимости (точнее, в случае main, при завершении процесса).
C++
1
return (x);
Возвращает вызвавшему процессу х, а не освобождает место

Возможно, имелось ввиду это:
C++
1
2
3
4
int char;
int x;
int main()
{...}
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
17.09.2009, 22:20  [ТС] #3
Цитата Сообщение от GAV_13 Посмотреть сообщение
Возвращает вызвавшему процессу х, а не освобождает место
значит сама по себе освобождается,спасибо

Цитата Сообщение от GAV_13 Посмотреть сообщение
Возможно, имелось ввиду это:
Код C++
1
2
3
4
int char;
int x;
int main()
{...}
нет
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.09.2009, 22:23 #4
Ответ на первый вопрос.
Значит, при возвращении ты НЕ обнуляешь ячейку памяти, где хранилось значение переменной x

То есть если в функции под переменную int x= 1234 была отведена ячейка, допустим, с номером
0X22ffee. И пусть функция x возвращает эту переменную. Тогда

После такой записи
int d= f ();

В ячейке памяти, которая отведена под переменную d (допустим 0X224400) появится значение 1234.
И это же значение ОСТАНЕТСЯ в ячейке 0X22ffee

Просто напросто прога не будет больше обращаться к этой ячейке и всё.
Почему не обнуляет? Потому, что это лишние ресурсы. Можно просто не обращаться к этой области памяти и всё.
...А что глобальные? Если ты их явно обнулишь, то они обнулятся, если нет, то нет.

P.S. Медвед, скачай отладчик OllyDbg и своими глазами всё увидь.
0
AnonymC
1173 / 455 / 28
Регистрация: 23.06.2009
Сообщений: 6,342
Завершенные тесты: 1
17.09.2009, 22:30  [ТС] #5
Цитата Сообщение от kravam Посмотреть сообщение
Если ты их явно обнулишь, то они обнулятся, если нет, то нет.
то есть как обнулить?
так?
C++
1
int x=0;
?
0
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 22:38 #6
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Цитата Сообщение от kravam Посмотреть сообщение
Просто напросто прога не будет больше обращаться к этой ячейке и всё.
Очищать имеет смысл только структуры данных (классы, динамические массивы)
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.09.2009, 23:03 #7
Цитата Сообщение от GAV_13 Посмотреть сообщение
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Нет, не бессмысленно.
Короче, медвед, скачивай отладчик и смотри. И помни само собой ничего не обнуляется. В том смысле, чтобы занести в ячейку 402000 некоторые данные, (обнулить, доопустим) процессор должен выполнить такие команды.

MOV EAX, 0
MOV DWORD PTR DS:[402000],EAX

Что они значат, пока неважно. Но они ДОЛЖНЫ быть выполнены.
Теперь смотри. Ты обнулял? Нет. Откуда им взяться в коде процессора?

Операционной системе нет дела до того, что творится в адресном пространстве твоей программы. Она не вмешивается сюда.
Штука, называемая средой программмирования, в принципе может так сделать-сделать исходый код, что обнуление будет присутвтвовать автоматом. Но зачем опять же? Что бы ты подольше сидел курил, когда у тебя рекурсия выполняется?
Если проге необходимо занести данные в ячейку памяти, то на возможнсоть это сделать содержание ячейки не влияет абсолютно.

Скачивай отладчик и смотри.
0
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:09 #8
kravam,
Цитата Сообщение от kravam Посмотреть сообщение
Нет, не бессмысленно.
а в чем смысл? что-то не догоняю...
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.09.2009, 23:15 #9
Цитата Сообщение от GAV_13 Посмотреть сообщение
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Имелось ввиду- какой смысл присваивать переменой x значение 0, если оно (см. цитату выше). И так будет нулём.

Я сказал, что нулём оно не будет. Надо тебе обнулять- обнуляй руками.

...Только щас задумался- а каким образом?
Ну, вышли мы из функции. Ну, надо нам, допустим обнулить ту ячейку памяти, которая в ОТРАБОТАВШЕЙ функции задействована?
Не вижу я способов. Не задумывался я над ними. Не было необходимости.
0
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:23 #10
Цитата Сообщение от kravam Посмотреть сообщение
Ну, надо нам, допустим обнулить ту ячейку памяти, которая в ОТРАБОТАВШЕЙ функции задействована?
ну, обнулить можно и перед выходом... только ЗАЧЕМ? Я считаю это бессмысленным, (а вы говорите что не бессмысленно) потому как это простая переменная, и уничтожиться она сама, (в том смысле что не будет утечки памяти)... это же не класс какой-нибудь, который резервирует память и если его не очистить он не отдасть зарезервированную под его хранение память...

Добавлено через 28 секунд
PS кажется, мы друг друга не поняли
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.09.2009, 23:41 #11
А что глобальные? Если ты их явно обнулишь, то они обнулятся, если нет, то нет.
Тут ты путаешь.
Если ты глобальной переменной типа int ты ничего не присваивал - но ее значение все равно будет 0.

Добавлено через 1 минуту
как это пнять?Что это такое и почему компилятор находит тут ошику?
Это какая-то кривая ерунда - забудь про нее.

Добавлено через 2 минуты
скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
Не совсем так. Просто указатель стека сдвинется и как бы освободит место.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю?
Если у тебя глобальная переменная ссылается на какую-то область памяти в куче, то ты ее должен освободить явно до выхода из программы.
1
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
17.09.2009, 23:42 #12
Цитата Сообщение от kravam Посмотреть сообщение
MOV EAX, 0
MOV DWORD PTR DS:[402000],EAX
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
Assembler
1
MOV DWORD PTR DS:[402000],0
Такая схема записи не поддерживается.

Не важно, что хранится по адресу - переменная, обьект(ну нету такого понятия как класс по отношению к памяти, есть только обьекты), массив, etc. все равно по закрытию процесса все ресурсы выделенные потоку(потокам) этого процесса буду помечены как свободные для записи и там будет тот мусор, которые вы можете наблюдать когда вылезете за пределы выделеной вам памяти. Смысла в том чтобы принудительно что-либо обнулять нету. И поверьте, то что пишут в книгах типа "удаляйте динамически выделенную память под массивы" - это они вырабатывают в вас привычку это делать, но для массивов даже в 1000 элементов делать это бессмысленно. Это имеет смысл тогда когда идут реально большие затраты ресурсов памяти, которые необходимо периодически освобождать, чтобы зря не загружать ОЗУ.
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.09.2009, 23:47 #13
И поверьте, то что пишут в книгах типа "удаляйте динамически выделенную память под массивы" - это они вырабатывают в вас привычку это делать
И очень правильно делают !
А иначе ты будешь писать кривой КОД с утечками памяти !!!
И потом есть программы-серверы, которые сутками крутятся. Есть сами операционные системы - тоже сутками крутятся. Все нужно делать корректно.
Только для учебных целей можно плюнуть на это и не освобождать память.

Добавлено через 1 минуту
Есть и менее экзотические примеры - броузеры, почтовые программы, текстовые редакторы. И прочее, прочее, прочее.
Ты хочешь чтобы твой броузер через час работы пожирал 1Gb памяти ?
0
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:49 #14
Цитата Сообщение от M128K145 Посмотреть сообщение
все равно по закрытию процесса все ресурсы выделенные потоку(потокам) этого процесса буду помечены как свободные для записи и там будет тот мусор, которые вы можете наблюдать когда вылезете за пределы выделеной вам памяти
Это по закрытию процесса. А если это функция? в которой память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
18.09.2009, 00:23 #15
Цитата Сообщение от M128K145 Посмотреть сообщение
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
И так далее.
Вот именно, не поддерживается. Сами спрашиваете и тут же сами и отвечаете.

Нужно 2 операции.
Сперва регистр обнуляем, потом память.

GAV_13, я что хочу сказать.
Надо обнулять- обнуляй. Не надо- не обнуляй. Само не обнулится.
Всё!

...Я вчера полночи изучал конструктор копирования и следил за переменными в отладчике. При возвращении фунцией значения ничто нигде не обнуляется, ещё раз повторю.

Вот зачем программе (любой) чтобы в некоторой ячейке памяти был ноль (если она эту ячейку не задействует)? Низачем
Если этой проге нужно что-то туда написать, она туда напишет.
ноль там будет, два, три, пять- наважно. Программе всё равно. Она поверх этого значения напишет.

А если некто пишет, например printf ("stroka"), то каждый уважающий себя программёр должен ЗНАТЬ, что шестой по счёту элемент будет обнулён и не говорить: "это сделано без моего ведома".

Теперь: термин "уничтожение переменной".
Он мне непонятен.
Переменная характеризуется двумя сущностями- адресом и значением.

Ну, можно за уши притянуть к этому термину.
То есть обнуляется. Но адрес-то остаётся!
Потому я его и не использую, он непонятно что значит.

...И в областях памяти для отработанных функций тоже будет мусор! Щас постараюсь прикрепить скриншот.
0
18.09.2009, 00:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2009, 00:23
Привет! Вот еще темы с ответами:

Два вопроса по простой программе - C++
Вообщем начал изучать С++ (и из этого следует что я ничего не понимаю в программировании) В интернете скачал учебник "С++ для чайников" ...

два вопроса по С++,вопрос про заг.файла и поток cin - C++
1.У меня есть заголовoчный файл,созданный в проекте А,в проекте В он нужен,как его туда добавить?Надо самим файл из папку в папку...

ввести строку а с клавиатуры. вместо каждой точки поставить два знака вопроса. и подсчитать колличество слов в предложении - C++
ввести строку А с клавиатуры. вместо каждой точки поставить два знака вопроса. и подсчитать колличество слов в предложении. помогите...

Реализация мелких функций в hpp - C++
Здравствуйте! Есть шаблон класса Vector с кучей мелких функций, типа сумма, разность, operator+, проч. Вопрос - стоит ли выносить их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.