137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
||||||
1 | ||||||
Почему локальная переменная не уничтожается после выхода из функции13.07.2012, 15:26. Показов 8792. Ответов 21
Метки нет (Все метки)
В функции создается строка char *pn = new char[ strlen(temp) + 1 ];. Мне непонятно почему при выходе из функции эта строка доступна в main()? Почему эта строка не удаляется после выхода из функции?
0
|
13.07.2012, 15:26 | |
Ответы с готовыми решениями:
21
Почему переменная "d" не была удалена из стека после выхода из функции? Уничтожается переменная по выходу из функции. так не должно быть Локальная переменная внутри статической функции Почему выводит ошибку C4700, что локальная переменная неинициализированна, если она инициализированна |
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
|
13.07.2012, 15:41 [ТС] | 3 |
Как же не локальные если она внутри другой функции.? Переменная temp[80] уничтожается после выхода а pn что остается?
В pn копируется строка temp и она не удаляется?
0
|
Модератор
|
|
13.07.2012, 15:54 | 4 |
Локальные переменные создаются в стеке и освобождаются после выхода из функции. Переменные, создаваемые оператором new, "живут" не в стеке, а в куче. Куча глобальна. Поэтому указатель на массив из кучи можно вернуть из функции (оператором return) и использовать в другой функции.
Добавлено через 3 минуты - обе уничтожаются... Но не уничтожается блок памяти в куче, на который указывала pn. Этот указатель возвращается оператором return.
1
|
13.07.2012, 15:55 | 5 | |||||
Память под строку выделяется в куче, совместно используемой всеми функциями. Такая память не освобождается по завершению функции, для этого надо вызывать delete.
А сам по себе указатель pn - локальная переменная, содержащий адрес первого элемента этой строки. return pn - просто возвращает значение этого адреса. Как в случае
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
13.07.2012, 16:07 | 6 |
Не в pn, а в область памяти размером strlen(temp) + 1, которая выделяется в динамической памяти, и адрес которой помещается в указатель pn. Этот адрес, после выхода из функции getName() нужно сохранить (так как pn - локальная переменная). Что и делается в строке: name = getName(); Теперь указатель name хранит адрес области памяти, куда скопировали temp.
1
|
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
|
13.07.2012, 16:43 [ТС] | 7 |
Спасибо всем что объяснили Вроде немного стало понятно. А то вот читаю книгу и главное никак не могу разобраться с этой задачей.
Добавлено через 36 минут Тогда что находится в этой динамической памяти доступно в любом месте программы? Просто нужно знать ее адрес?
0
|
Нуб со стажем
36 / 34 / 10
Регистрация: 19.02.2012
Сообщений: 118
|
|
13.07.2012, 16:52 | 8 |
1
|
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
||||||
13.07.2012, 17:18 | 9 | |||||
Catstail, что то вы путаете
1
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
13.07.2012, 17:30 | 10 | |||||
Intel~lect, после того, как эта память перестанет быть нужной, необходимо её освободить :
Добавлено через 9 минут Просто не так выразился. Наверное, имелось ввиду, что указатель, который возвращает new, содержит адрес памяти не в области, предназначенной для хранения локальных переменных.
0
|
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
||||||
13.07.2012, 17:30 [ТС] | 11 | |||||
Нет. Она все таки доступна Правда другим способом.
0
|
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
||||||
13.07.2012, 17:40 | 12 | |||||
Intel~lect,
после оперетора return функция завершает свою работу
0
|
Модератор
|
|
13.07.2012, 17:57 | 13 |
Я действительно не вполне удачно выразился. Указатель pn - локальная переменная. Длиной в 4 байта. Содержит адрес, указывающий в кучу. Этот адрес возвращается в вызывающую программу. Переменная pn (4 байта в стеке) уничтожается при выходе из функции.
1
|
13.07.2012, 18:20 | 14 |
Переменная с именем pn, естественно недоступна в main, потому что имеет локальную область видимости внутри функции getSymbol.
Но сама строка, динамически размещённая в куче, доступна из других функций.
0
|
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
|
13.07.2012, 18:28 | 16 |
0
|
137 / 126 / 14
Регистрация: 03.07.2012
Сообщений: 355
|
|
13.07.2012, 18:33 [ТС] | 18 |
Я это что спросил. Вот если строка динамически создается в одной функции, а удалять в другой. Ведь так и запутаться можно! Неудобно.
Да и забыть также можно про освобождение памяти.
0
|
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
|
|
13.07.2012, 18:34 | 19 |
Schizorb, Ага, тогда понятно
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
13.07.2012, 18:40 | 20 |
c помощью указателя, возвращённого оператором new,и ,предусмотрительно, сохранённого в указателе name.
Добавлено через 2 минуты На совести программиста следить за этим, или использовать классы с автоматическим управлением памятью, которые сами за этим следят.
1
|
13.07.2012, 18:40 | |
13.07.2012, 18:40 | |
Помогаю со студенческими работами здесь
20
Локальная переменная масив не создаеться в вызваной функции Почему не запоминается переменная после первого вызова функции ? Переменная запоминающаяся после выхода из программы Почему в выводе выдаются предупреждения "warning C4101: sm: неиспользованная локальная переменная" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |