Форум программистов, компьютерный форум CyberForum.ru

маленький простенький вопросик... - C++

Восстановить пароль Регистрация
 
ИБРО25
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 5
16.10.2011, 18:39     маленький простенький вопросик... #1
Здравствуйте ТоварисЧИ!!! есть маленький простенький вопросик по СИ:

есть 2 функции func1, func2, в которых выполняется дофига других маленьких функций... можно ли как-нибудь очищать память по завершению работы каждой из функций, не вдаваясь в подробности, что в этих функциях происходит?

вопрос принципиальный... в инете только примеры с массивами, переменными и т.д. и т.п.... может в книге пропустил что-то...

заранее благодарю за все ответы)))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2011, 18:39     маленький простенький вопросик...
Посмотрите здесь:

C++ Небольшой вопросик
Не сложный вопросик!!! C++
C++ Назрел вопросик разбить 0xF32A на 0xF3 и 0x2A
C++ массивы, есть вопросик
из Visual Basic в С++..маленький вопросик C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.10.2011, 18:44     маленький простенький вопросик... #2
ИБРО25, память, выделяемая в кадре стека функции, очищается автоматически при ее возврате. А вообще, вопрос слишком общий. Приведи хоть пример кода
Сыроежка
Заблокирован
16.10.2011, 18:45     маленький простенький вопросик... #3
Цитата Сообщение от ИБРО25 Посмотреть сообщение
Здравствуйте ТоварисЧИ!!! есть маленький простенький вопросик по СИ:

есть 2 функции func1, func2, в которых выполняется дофига других маленьких функций... можно ли как-нибудь очищать память по завершению работы каждой из функций, не вдаваясь в подробности, что в этих функциях происходит?

вопрос принципиальный... в инете только примеры с массивами, переменными и т.д. и т.п.... может в книге пропустил что-то...

заранее благодарю за все ответы)))
Вопрос не понятный. Что вы собираетесь "очищать"?! Функции завершили свою работу, и память, которая выделялась для ее локальных переменных, снова попадлет в распоряжение вашей программы.
ИБРО25
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 5
16.10.2011, 18:46  [ТС]     маленький простенький вопросик... #4
О!!! Благодарю за ответы!!! ))) именно это и хотел узнать!! большое спасибо!!! )))
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
16.10.2011, 18:47     маленький простенький вопросик... #5
Что-то у меня смутные сомнения по тому, правильно ли ты понял ответы. Так что приведи примерный код своих функций, на всякий случай
ИБРО25
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 5
16.10.2011, 18:52  [ТС]     маленький простенький вопросик... #6
вопрос заключался в том, освобождается ли память по завершению работы созданных мной функций... если она не выделяется внутри функций... код не имеет смысла писать)

Добавлено через 1 минуту
поэтому вопрос и был простым)) просто сижу кодю и в ступор встал))
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.10.2011, 14:44     маленький простенький вопросик... #7
Цитата Сообщение от ИБРО25 Посмотреть сообщение
освобождается ли память по завершению работы созданных мной функций
и
Цитата Сообщение от ИБРО25 Посмотреть сообщение
если она не выделяется внутри функций
как-то не стыкуется, не?
ИБРО25
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 5
18.10.2011, 00:23  [ТС]     маленький простенький вопросик... #8
вы правы, silent_1991, как-то не логично получилось... вопрос неправильно сформулировал изначально...

ммм... да... я создаю переменные в функции... работаю с ними... и по завершении они всё равно в памяти остаются если я вызываю другую функцию? (память, выделенную на переменные внутри функций, не очищаю)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void func1 ()
{
int a, b, c;
//далее работаю с переменными.... (не очищаю память по окончанию)
}
 
void func2 ()
{
int a, d, e;
//далее работаю с переменными.... (не очищаю память по окончанию)
}
 
void main ()
{
if (условие выбора функции) func1();
if (условие выбора функции) func2();
}
вопрос в том, что если я запущу после func1() функцию func2(), память очистится автоматически по окончании работы func1()?

или я что-то не понимаю?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
18.10.2011, 03:28     маленький простенький вопросик... #9
Переменные. которые ты объявляешь таким образом создаются в процессе выполнения программы.
Они "кладутся" в область памяти, называемую стеком. Стек состоит из ячеек, каждая ячейка пронумерована.
Теоретически любой программе может быть выделено 4 гигабайта оперативной памяти под разные нужды, часть из них под стек (читай: под эти самые твои a, b и с)

Предположим, что стек имеет 20 ячеек. Первая ячейка имеет адрес 131, последняя (учитывая размер стека 20 имеет адрес 150). Вся остальная память занята под что угодно. Ячейка с нижним адресом (131) это начало стека, верхняя (150)- вершина стека (вершина всегда должна быть больше начала)

ВСЕ ДАННЫЕ КЛАДУТСЯ ТОЛЬКО НА ВЕРШИНУ СТЕКА. ПОСЛЕ КАЖДОГО СОЗДАНИЯ ДАННЫХ АДРЕС ВЕРШИНЫ СТЕКА МЕНЯЕТСЯ В МЕНЬШУЮ СТОРОНУ.

Итак, переда началом выполнения функции вершина стека имеет адрес 150. В ней может находиться что угодно.

Функция начала выполняться; то есть в ней создались данные и чё-то там делается внутри этой функции. Это значит, что в ячейке с номером 150 лежит переменная a, в ячейке с номером 149 лежит переменная b, в ячейке с номером 148 лежит переменная c. Если бы у этих переменных были значения (например, 1, 2, 3), то по этим адресам лежало бы 1, 2 и 3. А если они не проинициализированы, то по этим даным лежит мусор.

Вопрос: где щас вершина стека? Ответ: в ячейке N148

Вопрос:
Допустим, твоя функция f_1 вызывает какую-нибудь функцию f_2, которая таким же макаром объявляет переменные d и e. По каким адреса лягут переменные функции f_2? Ответ: они лягут на вершину стека, то есть по адресу N 148 и 147.

Вопрос: что будет если мы так, вызывая функцию за функцией дойдём до начала стека? Ответ: крах программы (рекурсивные функции тем и плохи, что требуют большого стека.)

Вопрос: допустим, функция f_2 отработала. Где щас вершина стека? Ответ: умный компилятор позаботился о том, чтобы вершиной стека стала снова ячейка N148, как и было ДО ВЫЗОВА функции f_2

Вопрос: когда f_2 закончит свою работу, что окажется по адресам 148, 147 и так далее?
Ответ: наверное, ты хотел спросить, куда денутся переменные, которые лежали по этим адресам? Ответ: там и будут лежать, никуда они не денутся. Может, они были изменены в процессе выполнения f_2. Важно то, что к этим ячейкам просто доступа нет, а так они никуда не делись, лежат себе.

Вот и всё. Если чё- иди на wasm в "исследование программ", там всё поймёшь

И давай темам более содержательные названия.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 08:40     маленький простенький вопросик...
Еще ссылки по теме:

C++ Маленький вопросик
Мааааленький такой вопросик C++
C++ маленький вопросик

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
18.10.2011, 08:40     маленький простенький вопросик... #10
ИБРО25, тут главное понять идею:

C++
1
2
3
4
5
void func1()
{
    int A;  //создаётся на стеке. Судьба переменной после того, 
              //как функция отработает нас не интересует
}
C++
1
2
3
4
5
6
7
void func2()
{
     int* ptr = new int; //выделяем память на куче.
                                //Попользовался - не забудь за собой почистить.
                                //Правило тут простое - кто выделял, тот и освобождает
                                //Если не освободить - будит утечка памяти
}
Yandex
Объявления
18.10.2011, 08:40     маленький простенький вопросик...
Ответ Создать тему
Опции темы

Текущее время: 04:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru