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

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

Войти
Регистрация
Восстановить пароль
 
ИБРО25
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 5
#1

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

16.10.2011, 18:39. Просмотров 389. Ответов 9
Метки нет (Все метки)

Здравствуйте ТоварисЧИ!!! есть маленький простенький вопросик по СИ:

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

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

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

маленький вопросик - C++
как выглядит блок схема....особенно интерисует к 1й строчке.. for(opMatr(),i=n;i>=0;c0=aa,i--) //Обратный ход метода; ...

Маленький вопросик - C++
public partial class Form1 : Form { float AnswerValue; float ScreenValue; string SumString; ...

из Visual Basic в С++..маленький вопросик - C++
как Dim a As Double Dim b As Integer записать на с++???

Не сложный вопросик!!! - C++
В базовом классе перегрузил operator<<, затем в производном переопределил. Как при использовании указать что бы выполнялся operator<< из...

Небольшой вопросик - C++
Помогите ответить на вопрос, давно не ввлезал в си, а вот пришлось решать тест и я сел на этом вопросе. Если ключ доступа не указан явно...

Мааааленький такой вопросик - C++
Если у меня есть переменная V типа int и ей в цикле присваевается некоторое значение, то как я могу "оградить" себя и программу от того...

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

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

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

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

Добавлено через 1 минуту
поэтому вопрос и был простым)) просто сижу кодю и в ступор встал))
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
17.10.2011, 14:44 #7
Цитата Сообщение от ИБРО25 Посмотреть сообщение
освобождается ли память по завершению работы созданных мной функций
и
Цитата Сообщение от ИБРО25 Посмотреть сообщение
если она не выделяется внутри функций
как-то не стыкуется, не?
0
ИБРО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()?

или я что-то не понимаю?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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 в "исследование программ", там всё поймёшь

И давай темам более содержательные названия.
0
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; //выделяем память на куче.
                                //Попользовался - не забудь за собой почистить.
                                //Правило тут простое - кто выделял, тот и освобождает
                                //Если не освободить - будит утечка памяти
}
0
18.10.2011, 08:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 08:40
Привет! Вот еще темы с ответами:

массивы, есть вопросик - C++
вопрос по массивам. среда Visual C++. Есть код программы. #include <stdlib.h> #include <stdio.h> #include <time.h> #include...

Назрел вопросик разбить 0xF32A на 0xF3 и 0x2A - C++
Есть массив hex значений: #include "stdafx.h" #include <iostream> #include "conio.h" using namespace std; __int16 aaa =...

Маленький калькулятор - C++
Собственно не работает if почему-то. Например когда вводишь число 7, то выполняется действие из пункта 5 # include <iostream.h> #...

Простенький калькулятор - C++
Здравствуйте. На днях делать было нечего, вот я и решил написать простой калькулятор. Я его написал, начал компилировать, а тут ошибка...


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

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

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