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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
#1

Что и куда девается... - C++

14.11.2009, 21:19. Просмотров 1537. Ответов 25
Метки нет (Все метки)

Не очень хорошо знаю несколько вещей, а узнать хотелось бы очень.

Вопрос 1.
Локально объявленные переменные удаляются из памяти по окончании блока, так? Или же они где-то повисают, просто становясь недоступными?
Например.
C++
1
2
3
4
void main (void)
{
for (int a=0; a<8; a++) {/*код*/}
}
Переменная a удалилась по выходе из for или где-то "провисла"?

Вопрос 2.
Глобально объявленные переменные: каково их время жизни?
C++
1
2
3
4
5
int x;
void main (void)
{
//код
}
Получается, что переменная x живет "вечно" и везде доступна, так?

Вопрос 3.
Функции и указатели на функции, объявленные глобально и локально. Тот же самый вопрос про них: время их жизни.

P.S. Буду очень благодарен за ссылку на соответствующую статью про распределение памяти, понятную не особо продвинутому среднестатистическому студенту.

Товарищи крутые программеры, не злитесь, хочется выяснить раз и навсегда
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2009, 21:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что и куда девается... (C++):

Не понятно куда девается значение по указателю? - C++
Есть класс class base { int count*; public: base(int _c) { count = &amp;_c; }

Резкий выход из проги: куда девается выделенная переменной память? - C++
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int...

Вложенные циклы. Что куда вложить? - C++
Здравствуйте, форумчане. Натолкните на мысль, пожалуйста. Есть такая задача: Написать программу, которая выводит на экран линию заданным...

Куда следует пойти туристам, что бы попасть на автобусную остановку? - C++
можете мне помочь с задачей. надо решить на С++ Туристы вышли из леса на шоссе неподалеку от километрового столба с отметкой А км и...

Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) - C++
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой...

Куда записывается \0 - C++
#pragma hdstop #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #define eof 26 #define max 1000 getline(char s,int lim) { int c,i; ...

25
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
16.11.2009, 03:11 #16
Цитата Сообщение от Red Planet
А где ж их тогда определять
определять можно только в общей области, можно вообще отдельный файл сделать определить там функцию (определение включает тело), а потом в главной функции записать объявление, тогда оно будет видно внутри главной функции и больше нигде (вызовы можно делать только там, где видно объявление), поэтому объявления пишут тоже в общей области и сверху, чтобы в каждой функции ниже можно было делать вызов (общая область видна в каждой функции)
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.11.2009, 04:19 #17
Совет автору:
Как ты уже понял, в арсенале программёра- любого- должно быть несколько инструментов. Отладчик- оди из них. Скачивай OllyDbg, посвяти ему плотно несколько дней и многое прояснишь для себя. Увидишь своими глазами ячейки памяти, предназначеннные для каждой переменной, увидишь, как изменяется их содержимое и изменяется ли вообще и при каких условиях.

100% тебе рано или поздно придётся это делать.
...А так-то мы все здесь материаличты. Ничто ниоткуда не берётся и ничто никуда не исчезает. То же и с переменными. Как была под переменную выделена ячейка памяти, так она, эта ячейка никуда до конца программы не денется, не исчезнет.
...В общем, занимайся.
2
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
16.11.2009, 20:31 #18
Как была под переменную выделена ячейка памяти, так она, эта ячейка никуда до конца программы не денется, не исчезнет.
Это не совсем верно.
Локальные автоматические переменные в функции создаются при входе в функцию и удаляются при выходе.
Делается это при помощи стека.
Так что ячейка пропадает

Добавлено через 59 секунд
Локально объявленные переменные удаляются из памяти по окончании блока, так? Или же они где-то повисают, просто становясь недоступными?
Факт в том что переменные становятся недоступными.
А вот удаляются ли они из памяти или нет - уже зависит от компилятора и его настроек.

Добавлено через 49 секунд
Глобально объявленные переменные: каково их время жизни?
Глобальные переменные существуют все время - можно сказать еще до реального вызова main().

Добавлено через 2 минуты
Функции и указатели на функции, объявленные глобально и локально. Тот же самый вопрос про них: время их жизни.
Функция - это некий код.
Обычные функции существуют все время выполнения.
А вот если подгружать динамические библиотеки - тогда можно подгрузить код, можно выгрузить. Обращение идет через указатель на функции (код).
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
16.11.2009, 21:28 #19
Цитата Сообщение от odip Посмотреть сообщение
Это не совсем верно.
Локальные автоматические переменные в функции создаются при входе в функцию и удаляются при выходе.
Делается это при помощи стека.
Так что ячейка пропадает
Я чейка не пропадает.
Если под стек процессу было выделено столко-то ячеек то ему столько-то и выделено.

Просто-напросто если локальные переменны лежали по адресам стека 100, 101, 102 при выходе из функции они как бы исчезнут. Это значит, что верхушка стека теперь станет больше, чем 102. Например, 105 и соответственно задействованный стек теперь располагает ячейками с номерами: 105, 106, 107 108 и так лдалее в зависимости от размера стека.

Вопрос: что стало с ячейками стека 104, 103, 102 и так далее- с теми, где лежали локальные переменные?
А ничего с ними не стало. Как были так и остались.
Хотя у каждого своё мнение может быть на этот счёт. У нас демократия, да.
0
Evg
Эксперт CАвтор FAQ
18368 / 6415 / 441
Регистрация: 30.03.2009
Сообщений: 17,795
Записей в блоге: 28
16.11.2009, 21:55 #20
kravam, попробую пояснить в твоих же терминах. Объяснение будет, мягко говоря, на пальцах. В жизни оно несколько не так, но для общего понимания, думаю, этого достаточно

C++
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
void func (void)
{
  int *p1, *p2;
 
  ...
  {
    int x; // попало в ячейку 100
    int y; // папало в ячейку 101
 
    ...
    p1 = &x;
  }
 
  // По достижению конца лексического блока компилятор считает,
  // что 100 и 101 больше не нужны. Естественно сами ячейки никуда не деваются
  // Но поскольку они больше не нужны, то их можно переиспользовать,
  // что и происходит в следующем лексическом блоке
 
  {
    int a; // попало в ячейку 100
    int b; // папало в ячейку 101
 
    ...
    p2 = &a;
  }
 
  // По тексту вроде бы как получается, что в p1 и p2 записывались
  // адреса на разные переменные, однако в этой точке значения указателей
  // p1 и p2 равны (это не обязательно так, зависит от того, как поступит компилятор,
  // но такая ситуация не исключается). Однако по стандарту использование p1 и p2
  // за пределами соотвествующих фигурных скобок попадает под "undefined behaviour"
}
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.11.2009, 08:28 #21
Я разве чему-то из вышесказанного противоеречил? Нет.
Всё верно. Единственное, что я по-моему, не сказал, так это то, что ячейки можно переиспользовать.
Просто не стал до ТС (помним, что значит ТС?) это доносить, пусть бы сперва проникся мыслью, что ячейки никуда не деваются.

Постепенность- мать ученья!
0
Evg
Эксперт CАвтор FAQ
18368 / 6415 / 441
Регистрация: 30.03.2009
Сообщений: 17,795
Записей в блоге: 28
17.11.2009, 12:30 #22
Цитата Сообщение от kravam Посмотреть сообщение
пусть бы сперва проникся мыслью, что ячейки никуда не деваются
Это правильный подход. Но этого мало, надо ещё уметь понятно объяснить. Для полного счастья тогда надо рисовать картинку стека и процедурные активации, потому что вот так на пальцах одним текстом ты вряд ли что-то доходчиво объяснишь.
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.11.2009, 12:53 #23
Лучше один раз увидеть, чем семь раз услышать. А потому
мой пост номер 17
Там и стек нарисован и код и прочее.
0
Evg
Эксперт CАвтор FAQ
18368 / 6415 / 441
Регистрация: 30.03.2009
Сообщений: 17,795
Записей в блоге: 28
17.11.2009, 15:11 #24
Ты ссылку не туда по ходу дал

Добавлено через 1 минуту
Или ты имеешь в виду стаь OlyDbg и будет тебе щастье? Ну это как-то уже малоинтересно. Точно так же на вопрос а как работает то-то и тот в операционных сиситемах можно дать ссылку на исходники ядра и сказать на вот ковыряйся
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.11.2009, 16:19 #25
Да нет, туда я ссылку дал.
Там никто не говорит: ковыряйся. (Хотя иногда можно).
Там всё разжёвывают и в рот кладут.

Тыкают: вот стек. Вот код. Вот синеньким подсвечены такие-то инструкции процессора, а зелёненьким такие. А вот и твоя строчка "Hello, word". А вот адрес по которому она расположена. А теперь ражми на кнопку F8 и посмотри, что оказалось на верхушки- чего? Правильно, стека.

...И так далее.
Так что всё круто. Кроме того, мой ничтожный жизненный опыт подсказывает мне, что без отладчика програмёру никуда. OllyDbg хороший отладчик, по ссылке хоршая инструкция, а автор созрел чтобы с ним познакомиться, раз такие вопросы задаёт.
0
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
19.11.2009, 18:03  [ТС] #26
Хм... Создавая тему, я и не думал, что такая дискуссия на несколько страниц развернется. Занялся OllyDbg. Вопросы по нему буду сюда писать.
0
19.11.2009, 18:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2009, 18:03
Привет! Вот еще темы с ответами:

Куда двинуться? - C++
Учусь на врача, программированием занимаюсь как хобби. Освоил книжку &quot;Моя первая программа на Си&quot;, пишу простые программы, пользуясь...

Куда дальше ? - C++
Хорошо освоил C++ STL Qt Win32 Api, но судя по всему для трудоустройства недостаточно . Куда дальше ? Мне говорили о возможности участия в...

Куда дальше? - C++
Ситуация такая: дошел до такого этапа что не знаю в каком направлении дальше развиваться! Большая часть тем рассматриваемая в этом разделе...

Куда передается управление - C++
Скажите если встречается тут break куда дпльше передается управление на какую строчку? int Matrix::CheckWord() { cout&lt;&lt;&quot;Enter...


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

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

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