Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70

Возвращение ссылки на локальную переменную

02.08.2014, 05:12. Показов 3417. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заметил недавно одну интересную вещь. Как вообще работает такой код? Причем коректно.
C++
1
2
3
4
5
6
7
8
9
10
11
int& func();
int main()
{
    cout << func();
}
 
int& func()
{
    int a = 99;
    return a;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2014, 05:12
Ответы с готовыми решениями:

Возвращение указателя на локальную переменную (массив)
Добрый день! Вопрос такой: Как правильно возвратить указатель на локальную переменную (или массив)? Программа ниже...

Возврат ссылки на локальную переменную
Привет, есть такой код: int*&amp; change(void) { int* x(new int(50)); return x; } int main(void) {

Указатель на локальную переменную
Добрый день, Помогите пожалуйста разобраться с Указателями. Есть запись и к ней есть ссылочный тип, пример: type PRecValue =...

14
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
02.08.2014, 05:18
Gwini, не очень-то корректно.
0
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
02.08.2014, 05:21  [ТС]
Цитата Сообщение от CyberSolver Посмотреть сообщение
Gwini, не очень-то корректно.
vs выводит 99
0
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
02.08.2014, 05:26
Gwini, а как вы думаете, что будет с локальной переменной по выходу из функции?
0
11 / 11 / 3
Регистрация: 08.03.2014
Сообщений: 70
02.08.2014, 05:31  [ТС]
Цитата Сообщение от CyberSolver Посмотреть сообщение
Gwini, а как вы думаете, что будет с локальной переменной по выходу из функции?
Ну должна удалиться, но она существует не в main() и после завершения func() ccылатся уже не на что. Я просто читал что такого делать нельзя, а тут на тебе...
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.08.2014, 06:25
Цитата Сообщение от Gwini Посмотреть сообщение
vs выводит 99
Просто так звёзды совпали, это ничего не значит.
0
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 4
Регистрация: 18.05.2013
Сообщений: 220
02.08.2014, 07:14
Цитата Сообщение от gray_fox Посмотреть сообщение
Просто так звёзды совпали, это ничего не значит.
Или cout внезапно принимает &&.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
02.08.2014, 07:24
Цитата Сообщение от Бендерродригез Посмотреть сообщение
Или cout внезапно принимает &&.
Возвращаемый тип lvalue же, ссылка на rvalue тут вообще не при чём.
0
И целого heap'а мало
 Аватар для Andrej
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
02.08.2014, 07:57
Код топик стартера после clanga тоже сработал, хотя, тот упорно жалуется на reference to stack memory.
А вот так сломало:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int& func();
 
int main()
{
    int& a = (func() = 5);
    int& b = (func() = 3);
    int& c = (func() = 1);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
};
 
int&
func()
{
    int a = 99;
    return a;
};
Выводит 1, мусор, мусор.
edit:
Хотя, можно и проще стэк затереть.
0
3 / 3 / 1
Регистрация: 29.06.2013
Сообщений: 107
02.08.2014, 09:28
Вот так можешь увидеть адрес своей переменной из функции.
Функция возвращает ссылку, и работает правильно выводя 99, а не адрес, ведь в выводе ты не поставил знак амперсанда перед вызовом функции.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    cout << &func() << endl;
    return 0;
}
 
int& func()
{
    int a = 5;
    return a;
}


Но так делать не рекомендуется:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    int &b = func();
    cout << &b << endl;
    cout << b << endl;
    return 0;
}
 
int& func()
{
    int a = 5;
    return a;
}

Так будет потеря данных.
Адрес ты примешь, но значение этого адреса изменится, так как переменная локальная
и её значение удаляется после выхода из функции. У меня вместо 5 выводит 100.

Потерю данных можно избежать если использовать статические переменные или указатели,
но вспомним основы: статические переменные хранятся в памяти до завершения приложения,
а с указателями нужно быть внимательным и не забывать очищать память, или приложение
за час и больше работы может занять 1 и больше Гб ОЗУ.

Пример с указателем:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int& func();
 
int main()
{
    int* b = &func();
    cout << b << endl;
    cout << *b << endl;
    delete b;
    
    return 0;
}
 
int& func()
{
    int *a = new int;
    *a = 5;
    return *a;
}

Вообще указатели это очень классная штука, учись работать с ними.
1
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
02.08.2014, 09:37
__SOKOL__, ну вы и насоветовали. Выделить в динамике int, чтобы он не потерялся? В Джаве такое будете проделывать, а здесь, если забыть delete (а по закону Мерфи он будет забыт),
Цитата Сообщение от __SOKOL__ Посмотреть сообщение
приложение
за час и больше работы может занять 1 и больше Гб ОЗУ.
0
3 / 3 / 1
Регистрация: 29.06.2013
Сообщений: 107
02.08.2014, 11:06
CyberSolver, Вы так говорите, будто тут пишется ЦЕЛОЕ приложение которое решает мировой кризис.
Это самый обычный пример, он вместо этого int может подставить любой тип данных, любой класс, так что я правильно всё посоветовал!

Добавлено через 33 секунды
Более того я яву не знаю.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
02.08.2014, 13:47
Я не знаком с С++, но где-то краем уха слышал, что например в С malloc всегда поступает именно таким образом - возвращает ссылку на локальную переменную, и никто не делает из этого трагедии...
0
 Аватар для CyberSolver
102 / 75 / 17
Регистрация: 23.07.2014
Сообщений: 877
Записей в блоге: 1
02.08.2014, 14:10
_Ivana, не иначе как от агенства ОБС.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.08.2014, 22:01
Цитата Сообщение от _Ivana Посмотреть сообщение
Я не знаком с С++, но где-то краем уха слышал,
Давайте вот без таких бабушких сказочек.
Цитата Сообщение от _Ivana Посмотреть сообщение
в С malloc всегда поступает именно таким образом - возвращает ссылку на локальную переменную
В Си нет ссылок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2014, 22:01
Помогаю со студенческими работами здесь

Последний ID в локальную переменную
Подскажите, пожалуйста, аналог кода для PG. На MSSQL работает так: declare @unit_id int; insert into unit (info) values ('unit...

Возвращение ссылки из функции
Привет, я немного не понимаю, почему в следующем коде в строках 16-17 надо возвращать именно ссылку: #include &lt;iostream&gt; ...

Как инициализировать локальную переменную?
Работаю над заданием. Нужно создать структуру &quot;Страна&quot;. Делаю все вроде правильно. Но есть одна проблема при компиляции у меня появляется...

Из ассемблерной вставки в локальную переменную
Нужно из ассемблерной вставки передать содержимое стека st(0) из указанного места в локальную переменную процедуры из которой запущена...

Перевести локальную переменную в глобальную
function am($a) { echo $a = str_ireplace('им. ', &quot;&quot;, $a); } есть функция, как мне использовать переменную $a в общем...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru