Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.92
Bers
Заблокирован
#1

Возвращение ссылки на локальный объект - C++

14.05.2012, 22:00. Просмотров 6493. Ответов 45
Метки нет (Все метки)

Цитата Сообщение от Toshkarik Посмотреть сообщение
Что за бред, приписывайте, пожалуйста, в конце, что это только Ваше мнение. Хоть и бредовое.

C++
1
2
3
4
5
6
int& foo()
{
    int a;
    //: warning C4172: возвращение адреса локальной или временной переменной
    return a;  
}
Компиляторы подобный бред ловят без проблем. Технически препятствий не существует. Назови хоть одну реальную причину, по которой сие разрешено стандартом?
 Комментарий модератора 
Спор родился тут
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2012, 22:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвращение ссылки на локальный объект (C++):

Возвращение ссылки на локальный объект - C++
В каком-то коде мельком видел что-то вроде: char& char_stub() { char c; return c; }; int main() {

Возвращение const ссылки на временный объект - C++
Добрый вечер, #include <iostream> using namespace std; struct Point { int _x; int _y; };

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

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

Локальный объект - C++ Builder
Вместо синусоиды у меня выводиться мусор. Помогите найти ошибку:help: Вот часть кода void __fastcall TForm1::Button2Click(TObject...

Возвращение ссылки на указатель использование её как левостороннего значения - C++
Есть шаблон: //------------------------------------------------------- template<class T> struct ts { private: void* data; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Bers
Заблокирован
15.05.2012, 01:23  [ТС] #31
Цитата Сообщение от lazybiz Посмотреть сообщение
Еще раз... Он об этом предупреждает! Идиот тот кто пишет!
Предупреждение - это уже личная забота компилятора о родимых программистах. Но это на усмотрение компилятора. А вот стандарт языка позволяет.

Цитата Сообщение от lazybiz Посмотреть сообщение
Никогда не путал. Прекрасно представляю в чем разница. Похоже даже лучше чем ты.
Ты путаешь "локальную переменную" с "локальной статической".
Локальные создаются на стеке, и имеют класс памяти auto.
Локальная статическая - в статической области памяти, и имеют класс памяти static.

Речь идет о локальных.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 01:27 #32
Ну как я понял, народ хочет, чтоб компилятор выдавал ошибку в этом месте, и это было бы "по стандарту".
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:38 #33
Цитата Сообщение от Bers Посмотреть сообщение
А вот стандарт языка позволяет.
Так и речь об этом. И я пытаюсь доказать что это не просто так сделано.

Цитата Сообщение от Bers Посмотреть сообщение
Ты путаешь "локальную переменную" с "локальной статической".
Локальные создаются на стеке, и имеют класс памяти auto.
Локальная статическая - в статической области памяти, и имеют класс памяти static.
Что ты подразумеваешь под "статической областью памяти" ?

Добавлено через 3 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Речь идет о локальных.
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
15.05.2012, 01:39 #34
Хорошо, а если подумать где это может пригодиться?
Может для каких нибуть низкоуровневых операций, либо просто это наследие си?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:40 #35
Цитата Сообщение от Avazart Посмотреть сообщение
Хорошо, а если подумать где это может пригодиться?
Пригодится что? Уточняй.
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
15.05.2012, 01:44 #36
Народ хочит Builder?
Миниатюры
Возвращение ссылки на локальный объект  
Bers
Заблокирован
15.05.2012, 01:46  [ТС] #37
Цитата Сообщение от lazybiz Посмотреть сообщение
И я пытаюсь доказать что это не просто так сделано.
В третий раз задаю этот вопрос: для чего может быть нужно возвращать ссылку на локальный или временный объект?

Цитата Сообщение от lazybiz Посмотреть сообщение
Что ты подразумеваешь под "статической областью памяти" ?
Я писал об этом чуть выше.

Цитата Сообщение от lazybiz Посмотреть сообщение
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
Он пропускает некорректный код. Правильно он должен был бы его запретить (ошибка времени компиляции).
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
15.05.2012, 01:46 #38
Пригодится что? Уточняй.
Про возврат ссылки на локальную не статическую переменную
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:47 #39
Билдер это мутант какой-то. В чем смысл? Давай без оффтопа.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
15.05.2012, 01:47 #40
Цитата Сообщение от Bers Посмотреть сообщение
1. Любой промышленный компилятор сразу палит, если функция возвращает не_валидную ссылку, и выбрасывает предупреждение.
ссылка не валидная но рабочая стек чаще всего не затирается(хотя может и есть компиляторы которые затирают стек) а смешается указатель стека так что в памяти останется значение
хотя это есть грязный хак
Цитата Сообщение от Bers Посмотреть сообщение
3. Назови хоть одну причину, по по которой может понадобиться возвращать ссылку на не_валидные данные? Зачем это может быть нужно?
у Касперски как то была статья зачем это нужно что то связано с шифрованием программы
там еще такой пример был пишу по памяти могу ошибаться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fnc1()
{
int a=5;
int b=10;
// здесь какое то выражение чтобы оптимизатор не выбросил переменные
}
fnc2()
{
int c; // =5 занимает туже память что a
int d; // =10 занимает туже память что b
}
int main()
{
fnc1();
fnc2();
}
передача параметров из функции в функцию
Бред полнейший но работает
но стоит взять другой оптимизатор может(скорее всего) и не сработать
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
15.05.2012, 01:52 #41
ссылка не валидная но рабочая стек чаще всего не затирается
Ага целую тему сегодня из-за этого мозолили...Определить состояние потока TThread
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:58 #42
Цитата Сообщение от Bers Посмотреть сообщение
В третий раз задаю этот вопрос: для чего может быть нужно возвращать ссылку на локальный или временный объект?
Понятия не имею.

Цитата Сообщение от Bers Посмотреть сообщение
Я писал об этом чуть выше.
Укажи номер сообщения.

Цитата Сообщение от Bers Посмотреть сообщение
Он пропускает некорректный код.
И где же он там некорректный? Укажи.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 02:47 #43
Цитата Сообщение от lazybiz Посмотреть сообщение
Да что ты говоришь. Посмотри на результат выполнения этой программы, и как следует изучи ее:
Не увидел почему то до этого данного сообщения. Так вот, Вы создаете ссылку на статический объект и называете его глобальным? Вы не можете к нему обратиться непосредственно по имени, кроме как в функции, где он объявлен, о какой глобальности может идти речь? И мы обсуждаем C++ а не ассемблер.
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
15.05.2012, 08:43 #44
Цитата Сообщение от Bers Посмотреть сообщение
В третий раз задаю этот вопрос: для чего может быть нужно возвращать ссылку на локальный или временный объект?
Более, чем уверен, что проблема растёт отсюда:

C++
1
2
3
4
5
int& func()
{
  int x;
  return x;
}
Данный код является логически некорректным. Ты хочешь, чтобы стандарт его запретил, потому что компилятор без каких бы то ни было анализов может сразу же выдать ошибку. Тогда возникает другая проблема. Перепишем немного исходный код:

C++
1
2
3
4
5
6
int& func()
{
  int x;
  int &y = x;
  return y;
}
Код делает то же самое, но компилятор уже не может что-то запрещать, потому что нужно выполнить анализ. В итоге из-за желаемого тобой запрета вышла бы несимметрия: вот так нельзя, но если сделать те же яйца, но в профиль, то можно. Авторы посчитали, что логичным поведением будет одинаковое поведение компилятора в одинаковых ситуациях

Добавлено через 1 минуту
Тут было много споров про "статические" переменные. В статье http://www.cyberforum.ru/blogs/18334/blog103.html в разделе 2 я описывал терминологию, упомянул и понятие "статический". Это полезно знать с той точки зрения, что разные авторы под словом "статический" могут подразумевать разные вещи
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 11:48 #45
Цитата Сообщение от Toshkarik Посмотреть сообщение
Не увидел почему то до этого данного сообщения. Так вот, Вы создаете ссылку на статический объект и называете его глобальным? Вы не можете к нему обратиться непосредственно по имени, кроме как в функции, где он объявлен, о какой глобальности может идти речь? И мы обсуждаем C++ а не ассемблер
Я не говорю что к такой переменной можно обратиться из вне. Я говорю что под такую переменную память выделяется не в стеке, и что она после выполнения функции никуда не пропадает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 11:48
Привет! Вот еще темы с ответами:

Возвращение ссылки или указателя на закрытый элемент класса. - C++
Всех уважаемых форуман. поздравляю с наступившим новым годом и прошу ответить на такой вопрос. Почему до сих пор современный C++ не...

Возврат указателя на локальный объект - C++
Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно: char* fun() { char *ptr1 = "Hello world!"; ...

Возвращение значения в функции, ссылки, вычислить корни квадратного уравнения - C++
Определить функцию вычисления корней квадратного уравнения. Функция должна возвращать значение 1, если корни найдены, значение 0, если...

Ссылки на объект и мультипоточность - C++
Такая проблема: есть два потока и глобально объявленная ссылка на объект, когда я инициализирую её в одном потоке, во втором она остаётся...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.05.2012, 11:48
Ответ Создать тему
Опции темы

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