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

C++

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

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

14.05.2012, 22:00. Просмотров 6270. Ответов 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++ Builder
C++ Возвращение ссылки или указателя на закрытый элемент класса.
C++ Локальный указатель на локальный строковый литерал
C++ Возвращение ссылки на указатель использование её как левостороннего значения
C++ Возвращение ссылки на локальную переменную
Возвращение значения в функции, ссылки, вычислить корни квадратного уравнения C++
Разъясните ситуацию с возвратом объекта или ссылки на объект C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
15.05.2012, 00:52  [ТС]     Возвращение ссылки на локальный объект #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
Дейтелы имеют другое мнение.
Дейтлы объясняют что такое класс памяти static?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:54     Возвращение ссылки на локальный объект #22
Цитата Сообщение от Bers Посмотреть сообщение
Дейтлы объясняют что такое класс памяти static?
Именно так. Глава называется "Классы памяти".
Bers
Заблокирован
15.05.2012, 01:01  [ТС]     Возвращение ссылки на локальный объект #23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Именно так. Глава называется классы памяти.
Тогда ты знаешь, что область видимости статической переменной не имеет никакого отношения ни к времени жизни этой переменной, ни к стеку.

Речь же идет о том, что компиляторы прекрасно видят факт возвращения ссылки на локальный объект. Созданный на стеке (если тебе нужны такие уточнения).

Но при этом, пропускают такой код.
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:06     Возвращение ссылки на локальный объект #24
Цитата Сообщение от Bers Посмотреть сообщение
1. Любой промышленный компилятор сразу палит, если функция возвращает не_валидную ссылку, и выбрасывает предупреждение.
так и есть
Цитата Сообщение от Bers Посмотреть сообщение
//: warning C4172: возвращение адреса локальной или временной переменной
Цитата Сообщение от Bers Посмотреть сообщение
3. Назови хоть одну причину, по по которой может понадобиться возвращать ссылку на не_валидные данные? Зачем это может быть нужно?
Я не говорил что это может понадобиться, я сказал что это можно сделать и компилятор возвращает предупреждение на это. Все верно.

Цитата Сообщение от Bers Посмотреть сообщение
4. Любые ошибки времени компиляции здорово экономят время (деньги) на отладке. И уж коли для компиляторов не существует технических препятствий, то почему стандарт разрешает компиляторам пропускать заведомо не корректный код?
Еще раз... Он об этом предупреждает! Идиот тот кто пишет!

Цитата Сообщение от Bers Посмотреть сообщение
5. Не путай статические данные с локальными.
Никогда не путал. Прекрасно представляю в чем разница. Похоже даже лучше чем ты.
Avazart
7062 / 5239 / 261
Регистрация: 10.12.2010
Сообщений: 23,042
Записей в блоге: 17
15.05.2012, 01:09     Возвращение ссылки на локальный объект #25
+ если переменная в функции определена как static, то она является глобальной (надеюсь это знает большинство), так почему же функция не может возвращать ссылку на нее!?
Имеется ввиду что то типо этого?
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
26
27
28
29
using namespace std;
 
int &gen(int &c) // c - чисто для проверки
 {
 static int i=0;
 c=i;
 i++;
 return i;
 }
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
int c;
 
gen(c);
cout<<c<<endl;
gen(c);
cout<<c<<endl;
gen(c)=0; // обнуление
cout<<c<<endl;
gen(c);
cout<<c<<endl;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:15     Возвращение ссылки на локальный объект #26
Цитата Сообщение от Avazart Посмотреть сообщение
Имеется ввиду что то типо этого?
Да, что-то вроде.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 01:16     Возвращение ссылки на локальный объект #27
Цитата Сообщение от Bers Посмотреть сообщение
никакого отношения
Я и не говорил ничего подобного. Я лишь сказал, что локальная переменная на то и локальная, что к ней можно непосредственно обращаться по имени только в определенных местах, в данном случае в пределах функции, или, более широко, в пределах первых внешних фигурных скобок.
Avazart
7062 / 5239 / 261
Регистрация: 10.12.2010
Сообщений: 23,042
Записей в блоге: 17
15.05.2012, 01:16     Возвращение ссылки на локальный объект #28
Да, что-то вроде.
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 01:18     Возвращение ссылки на локальный объект #29
Цитата Сообщение от lazybiz Посмотреть сообщение
Да, что-то вроде.
Вам уже ответили, что возвращать ссылку на статический объект можно, ни компилятор ни стандарт "не будет против".
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:22     Возвращение ссылки на локальный объект #30
Цитата Сообщение от Avazart Посмотреть сообщение
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
Не понял о чем ты. Без пунктуации читать невозможно.

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

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

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

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

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

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

Цитата Сообщение от lazybiz Посмотреть сообщение
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
Он пропускает некорректный код. Правильно он должен был бы его запретить (ошибка времени компиляции).
Avazart
7062 / 5239 / 261
Регистрация: 10.12.2010
Сообщений: 23,042
Записей в блоге: 17
15.05.2012, 01:46     Возвращение ссылки на локальный объект #38
Пригодится что? Уточняй.
Про возврат ссылки на локальную не статическую переменную
castaway
Эксперт С++
4876 / 3015 / 370
Регистрация: 10.11.2010
Сообщений: 11,075
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 01:47     Возвращение ссылки на локальный объект #39
Билдер это мутант какой-то. В чем смысл? Давай без оффтопа.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 01:47     Возвращение ссылки на локальный объект
Еще ссылки по теме:

Ссылки на объект и мультипоточность C++
C++ Возвращение ссылки на локальный объект
Возвращение ссылки из функции C++
C++ Возврат указателя на локальный объект
Возвращение const ссылки на временный объект C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6508 / 4974 / 459
Регистрация: 14.02.2011
Сообщений: 16,476
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();
}
передача параметров из функции в функцию
Бред полнейший но работает
но стоит взять другой оптимизатор может(скорее всего) и не сработать
Yandex
Объявления
15.05.2012, 01:47     Возвращение ссылки на локальный объект
Ответ Создать тему
Опции темы

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