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

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

Войти
Регистрация
Восстановить пароль
 
 
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
#1

Возврат ссылки на локальную переменную - C++

09.08.2015, 09:59. Просмотров 1768. Ответов 43
Метки нет (Все метки)

Привет, есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int*& change(void)
{
    int* x(new int(50));
    return x;
}
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int* y(change());
    cout << *y << endl;
    system("pause");
    return 0;
}
Объясните, почему выводится корректное значение, ведь локальный указатель должен был удалиться на выходе из функции.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2015, 09:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат ссылки на локальную переменную (C++):

Возвращение ссылки на локальную переменную - C++
Заметил недавно одну интересную вещь. Как вообще работает такой код? Причем коректно. int&amp; func(); int main() { cout &lt;&lt; func(); ...

VS2010 отладчик не видит локальную переменную - C++
Добрый день! С чем это может быть связано?

Передать локальную переменную в новую функцию - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;sstream&gt; #include &lt;string&gt; #include &lt;windows.h&gt; using namespace std; int...

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

Возврат ссылки - C++
int &amp; function(int); Понятно для чего передают аргументы в функцию как указатели или ссылки.Но зачем функция возвращает ссылку? Чтобы...

Ошибка E2363 Попытка возвратить локальную переменную - C++
Такую ошибку выдает компилятор Embarcadero, в Студии почему то ее не выдает, мне нужно сделать так чтобы и в эмбаркадеро не выдавало...

43
nmcf
5754 / 5065 / 1732
Регистрация: 14.04.2014
Сообщений: 20,749
09.08.2015, 10:09 #2
Потому что он просто не успел затереться. Сделай вызов какой-нибудь функции перед cout и посмотри на результат.
1
zss
Модератор
Эксперт С++
6634 / 6196 / 2051
Регистрация: 18.12.2011
Сообщений: 16,155
Завершенные тесты: 1
09.08.2015, 10:12 #3
Вы же инициализируете переменную адресом ДИНАМИЧЕСКИ выделенной памяти,
которая удаляется по delete, а не по выходу из функции.
При возврате адреса по ссылке передается именно этот адрес выделенной памяти.
Так что ничего криминального.....
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
09.08.2015, 10:13 #4
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
ведь локальный указатель должен был удалиться на выходе из функции.
Здесь освободится только память под указатель, ничего больше.

А корректное значение выдаётся только потому, что участок памяти по этому адресу остался не востребованным до вывода значения в 12-й строке.
1
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.08.2015, 10:15  [ТС] #5
zss, nmcf, по моему мнению должна произойти утечка памяти
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
09.08.2015, 10:17 #6
Потому, что память, где был указатель, осталась прежней.

Добавлено через 2 минуты
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
по моему мнению должна произойти утечка памяти
Если сделать delete y и y к моменту удаления будет валидным, то утечки не будет.
0
castaway
09.08.2015, 10:22
  #7

Не по теме:

Про ссылку то я и забыл...

0
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.08.2015, 10:23  [ТС] #8
Я не понимаю.
1) Создается локальный указатель, инициализированный началом дин. выделенной памяти
2) Вовзращаем этот локальный указатель
3) Время жизни данной переменной указателя заканчивается
4) Возвращается указатель, содержащий вобще левый адрес
5) Этим левым адресом должен быть инициализирован указатель в main()
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
09.08.2015, 10:26 #9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
4) Указатель должен содержать вобще левый адрес
почему?
0
MansMI
1305 / 1083 / 306
Регистрация: 08.01.2012
Сообщений: 4,148
09.08.2015, 10:27 #10
почему, в у вернулся реальный адрес, и с возвратом его из планки ОЗУ не вырвали
0
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.08.2015, 10:31  [ТС] #11
Dani,
0
Миниатюры
Возврат ссылки на локальную переменную  
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.08.2015, 10:35  [ТС] #12
Да даже такое все равно корректно работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int& change(void)
{
    int x =50;
    return *x;
}
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int y(change());
    cout << y << endl;
    system("pause");
    return 0;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
09.08.2015, 10:36 #13
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
1) Создается локальный указатель, инициализированный началом дин. выделенной памяти
допустим
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
2) Вовзращаем этот локальный указатель
возвращаем ссылку на него
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
3) Время жизни данной переменной указателя заканчивается
да, иксу кирдык
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
4) Возвращается указатель, содержащий вобще левый адрес
с чего? Ссылка продолжила ссылаться туда, где был x, так что если память там еще не затерта чем-то другим, то так и останется все
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
5) Этим левым адресом должен быть инициализирован указатель в main()
ну тут смотреть предыдущий пункт
1
Ferrari F1
622 / 519 / 101
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.08.2015, 10:39  [ТС] #14
Цитата Сообщение от Croessmah Посмотреть сообщение
чего? Ссылка продолжила ссылаться туда, где был x
Значение переменной x - адрес (если говорить про самый 1ый пример)
Выходим из функции - это значение адреса удаляется, указатель содержит неопределенное значение (переменная-указатель же не статическая)
Следовательно, ссылка тоже содержит неопр. значение
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
09.08.2015, 10:43 #15
Вот Вам интересный пример для раздумий (не пытаться повторить, т.к. это UB):
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
#include <iostream>
 
int& change()
{
    int x =50;
    return x;
}
 
 
 
int& foo ()
{
    int x = 160 ;
    return x ;
}
 
 
int main()
{
    int & x = change() ;
    foo() ;
    int y(x);
    std::cout << y << std::endl;
    return 0;
}
http://rextester.com/GLWY95528

Добавлено через 1 минуту
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
это значение адреса удаляется
переменная удалилась, а память, которую занимала эта переменная осталась.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
указатель содержит неопределенное значение
Вот об этом Вам и говорят. Там может быть прежнее значение, а может и не быть его уже
1
09.08.2015, 10:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2015, 10:43
Привет! Вот еще темы с ответами:

Возврат ссылки из функции - C++
Изучаю С++, знаю С. Вот такой простенький вопросик есть. В чем вообще разница: class Str { public: Str func() {return...

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

Не могу заставить g++ не инициализировать локальную переменную нулем - C++
Привет! Есть такой код (из серии &quot;что будет напечатано на экран&quot;) #include &lt;iostream&gt; using namespace std; int x = 1; ...

Создание ссылки и возврат из функции - C++
Есть вот такая функция, возвращает максимальный элемент. template &lt;typename Type&gt; inline const Type max_(const Type&amp; a, const Type&amp; b) ...


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

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

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