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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
#1

Почему локальная переменная не уничтожается после выхода из функции - C++

13.07.2012, 15:26. Просмотров 1907. Ответов 21
Метки нет (Все метки)

В функции создается строка char *pn = new char[ strlen(temp) + 1 ];. Мне непонятно почему при выходе из функции эта строка доступна в main()? Почему эта строка не удаляется после выхода из функции?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char *getName(void)
{
    char temp[80];
    
    cout << "Enter last name: ";
    cin >> temp;
 
    char *pn = new char[ strlen(temp) + 1 ];
    strcpy(pn, temp);
 
    return pn;
}
 
int main()
{
   char *name;
 
   name = getName();
}
Объясните, пожалуйста, что вообще там происходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2012, 15:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему локальная переменная не уничтожается после выхода из функции (C++):

Почему переменная "d" не была удалена из стека после выхода из функции? - C++
Почему переменная &quot;d&quot; не была удалена из стека после выхода из функции? #include&quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; ...

Уничтожается переменная по выходу из функции. так не должно быть - C++
Все доброго времени суток! В процессе отладки программки возник один вопрос... Есть функция: void bignum_fromhex(bignum_digit_t* num,...

Почему выводит ошибку C4700, что локальная переменная неинициализированна, если она инициализированна - C++
Все это более чем странно. #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;time.h&gt; #include &lt;cstdlib&gt; using namespace std; ...

Локальная переменная внутри статической функции - C++
Всем доброго дня! Из данного примера выяснилось, что при обьявлении функции func_1() статической, переменная x внутри этой ...

Локальная переменная масив не создаеться в вызваной функции - C++
Здравствуйте, Не укладывется в голове, после завершения рекурсий (т.е.контроль передаеться на if(ii==1){return 0;}) наступает цикл for...

Почему в выводе выдаются предупреждения "warning C4101: sm: неиспользованная локальная переменная" - C++
// gd.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; #include &quot;math.h&quot; ...

21
MrCold
856 / 754 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
13.07.2012, 18:28 #16
Цитата Сообщение от Schizorb Посмотреть сообщение
Но сама строка, динамически размещённая в куче, доступна из других функций.
Schizorb, пожайлуста, кодом если не трудно
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
13.07.2012, 18:31 #17
MrCold, самый первый пост в теме. В функции main создаётся указатель, ему присваивается адрес строки, память под которую выделена в другой функции.
0
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
13.07.2012, 18:33  [ТС] #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно в main(), можно не в main(). В вашем коде в main().
Я это что спросил. Вот если строка динамически создается в одной функции, а удалять в другой. Ведь так и запутаться можно! Неудобно.
Да и забыть также можно про освобождение памяти.
0
MrCold
856 / 754 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
13.07.2012, 18:34 #19
Schizorb, Ага, тогда понятно
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.07.2012, 18:40 #20
Цитата Сообщение от Schizorb Посмотреть сообщение
Но сама строка, динамически размещённая в куче, доступна из других функций.
c помощью указателя, возвращённого оператором new,и ,предусмотрительно, сохранённого в указателе name.

Добавлено через 2 минуты
Цитата Сообщение от Intel~lect Посмотреть сообщение
Да и забыть также можно про освобождение памяти.
На совести программиста следить за этим, или использовать классы с автоматическим управлением памятью, которые сами за этим следят.
1
kent
Нуб со стажем
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
13.07.2012, 19:18 #21
Цитата Сообщение от alsav22 Посмотреть сообщение
или использовать классы с автоматическим управлением памятью, которые сами за этим следят
например "Умный указатель" auto_ptr
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
13.07.2012, 19:25 #22
kent, стринг лучше
0
13.07.2012, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 19:25
Привет! Вот еще темы с ответами:

Почему указатель теряет свои значения после выхода с метода, память выделена динамически - C++
#include &lt;iostream&gt; using namespace std; void sqr( int* a, int length ); int main() { int *a = new int; int length =...

После выхода из функции, чтобы матрица не изменялась - C++
Как сделать так, чтобы передать матрицу в функцию, в функции матрицу изменить (поменять элементы матрицы симметрично относительно побочной...

Предотвращение продолжения работы потока после выхода из функции - C++
https://books.google.ru/books?id=1UXRAAAAQBAJ&amp;pg=PA47&amp;lpg=PA47&amp;dq=%D0%B0%D1%81%D1%81%D0%BE%D1%86%D0%B8%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D...

Локальная переменная - C++
Если в функции объявляется символ,например так: char f(void){ char ch; ch = getchar(); return ch; }


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

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

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