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

C++

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

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

14.05.2012, 22:00. Просмотров 6367. Ответов 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++ Возвращение ссылки на локальный объект
Возвращение const ссылки на временный объект C++
Возвращение ссылки из функции C++
C++ Возвращение ссылки на локальную переменную
Локальный объект C++ Builder
C++ Возвращение ссылки или указателя на закрытый элемент класса.
C++ Возвращение ссылки на указатель использование её как левостороннего значения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 22:05     Возвращение ссылки на локальный объект #2
Не понял, о чем Вы сейчас? К чему этот пример?
Попробую догадаться: А вы считаете что локальная переменная должна существовать все время?
Bers
Заблокирован
14.05.2012, 22:13  [ТС]     Возвращение ссылки на локальный объект #3
Цитата Сообщение от Toshkarik Посмотреть сообщение
Не понял, о чем Вы сейчас? К чему этот пример?
Попробую догадаться: А вы считаете что локальная переменная должна существовать все время?
Не правильно ты понял. Я считаю, что нет ни одной причины, по которой может понадобится возвращать не_валидные данные. Однако, язык это позволяет. Язык позволяет совершать бессмысленные глупые вещи.

И вроде бы итак понятно, что нет резона совершать глупые вещи:

C++
1
CSome* ptr; ptr->Method(); //trololo
Просто всем на это пофигу. И время от времени кто нибудь стреляет себе в ногу.
Это я называю "раздолбайством".

Ответственный подход: ситуации, которых быть не должно, не должны возникнуть в принципе.

Добавлено через 55 секунд
Цитата Сообщение от ForwardM Посмотреть сообщение
arr[i] == *(arr + i), а i[arr] == *(i + arr)
Тебе об этом сказали ещё в #4 посту
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 22:15     Возвращение ссылки на локальный объект #4
Ну а в жизни Вы тоже делаете плохие вещи, которые не стоит делать? Если Вы знаете язык, то не будете делать подобных ошибочных действий.
Bers
Заблокирован
14.05.2012, 22:19  [ТС]     Возвращение ссылки на локальный объект #5
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если Вы знаете язык, то не будете делать подобных ошибочных действий.
Возможность совершать заведомо глупые вещи на языке делает язык раздолбайским.
А убеждение, что это нормально - делает раздолбаем программиста, который на нем пишет.

Итого: см. начало диалога.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 22:22     Возвращение ссылки на локальный объект #6
Не возможность совершать, а само совершение глупых поступков делает раздолбаем. Если Вы хотите, чтоб за Вами приглядывали, как в дет. саду, то пожалуйста, не используйте данный язык. Но и в дет. саде дети иногда падают и калечатся.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
14.05.2012, 22:32     Возвращение ссылки на локальный объект #7
Bers, а не раздолбайские языки существуют?
Bers
Заблокирован
14.05.2012, 22:34  [ТС]     Возвращение ссылки на локальный объект #8
Цитата Сообщение от lazybiz Посмотреть сообщение
а не раздолбайские языки существуют?
Бейсик)
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
14.05.2012, 22:37     Возвращение ссылки на локальный объект #9
Все верно, чем язык более совершенен - тем он более могуч и раздолбаней.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
14.05.2012, 23:05     Возвращение ссылки на локальный объект #10
Bers, Evg, как выглядит возвращение ссылки на локальную переменную в описании стандарта и что там об этом говориться?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 23:08     Возвращение ссылки на локальный объект #11
Насколько мне известно undefined behavior, так как после возврата из функции все переменные уничтожаются, и передается адрес на то место, где была переменная, но там уже могут быть совсем другие данные.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
14.05.2012, 23:25     Возвращение ссылки на локальный объект #12
Toshkarik, ты о чем?
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,684
Записей в блоге: 26
14.05.2012, 23:33     Возвращение ссылки на локальный объект #13
Цитата Сообщение от lazybiz Посмотреть сообщение
Bers, Evg, как выглядит возвращение ссылки на локальную переменную в описании стандарта и что там об этом говориться?
Хз, я как-то в Си++ не сильно разбираюсь. Но не думаю, что как-то отдельно говорится. Возвращение ссылки выполняется ровно таким же образом, как и любое другое присваивание ссылки. А тухлой такая ссылка становится тоже на общих правилах: как только время жизни объекта заканчивается, ссылка становится невалидной
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 23:55     Возвращение ссылки на локальный объект #14
Цитата Сообщение от lazybiz Посмотреть сообщение
ты о чем?
Я о возвращении ссылки на локальный объект.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 00:19     Возвращение ссылки на локальный объект #15
Бред. Почему функция не может (не должна) возвратить ссылку/указатель на локальную переменную!? Кто-нибудь может на это ответить?
Язык Си/С++ многофункционален. Глупо думать что это недочет разработчиков.

+ если переменная в функции определена как static, то она является глобальной (надеюсь это знает большинство), так почему же функция не может возвращать ссылку на нее!?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:34     Возвращение ссылки на локальный объект #16
Цитата Сообщение от lazybiz Посмотреть сообщение
если переменная в функции определена как static, то она является глобальной
Вот это уже бред, переменная является локальной, и создается она при первом вызове функции и существует до конца программы. Единственный к ней доступ из вне - это присвоить ее адрес какому либо указателю. И ее как раз можно возвращать по ссылке.
Что касается автоматических переменных, то получается примерно такое:
C++
1
2
3
4
5
6
7
8
9
int *a = new int;
 
*a = 3;
 
int *b = a;
 
delete a;
 
std::cout << *b << std::endl;
Bers
Заблокирован
15.05.2012, 00:42  [ТС]     Возвращение ссылки на локальный объект #17
Цитата Сообщение от lazybiz Посмотреть сообщение
+ если переменная в функции определена как static, то она является глобальной (надеюсь это знает большинство), так почему же функция не может возвращать ссылку на нее!?
1. Любой промышленный компилятор сразу палит, если функция возвращает не_валидную ссылку, и выбрасывает предупреждение.

2. Любой промышленный компилятор ни слова не скажет, если функция возвращает валидную ссылку (в том числе, на статические данные, либо временный объект, который вернулся по константной ссылке)

3. Назови хоть одну причину, по по которой может понадобиться возвращать ссылку на не_валидные данные? Зачем это может быть нужно?

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

5. Не путай статические данные с локальными.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
15.05.2012, 00:48     Возвращение ссылки на локальный объект #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
переменная является локальной, и создается она при первом вызове функции и существует до конца программы.
Да что ты говоришь. Посмотри на результат выполнения этой программы, и как следует изучи ее:
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 &foo()
{
    static int a = 10;
    printf( "%d\n", a );
    return a;
}
 
int main()
{
    int &a = foo();
    a++;
    foo();
    return 0;
}
Так же советую тебе взять еще и дизассемблер (лучше IDA), и убедиться в том что это глобальная переменная.
Bers
Заблокирован
15.05.2012, 00:49  [ТС]     Возвращение ссылки на локальный объект #19
Цитата Сообщение от Toshkarik Посмотреть сообщение
переменная является локальной, и создается она при первом вызове функции
Статические переменные являются статическими, а не локальными (Кэп намекает).
И создаются они ещё при запуске процесса. (грубо говоря до входа в точку main).
Процесс создания такой переменной - выделение памяти, и не более того. Информация о том, сколько понадобится памяти находится в бинарном файле запускаемой программки.

При первом запуске функции статические переменные инициализируются. (получают начальные значения)

Для тяжелых типов данных, это означает, что пока функция не будет запущена, не будет потрачено время на инициализацию её статических данных, и не более того.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 00:51     Возвращение ссылки на локальный объект
Еще ссылки по теме:
C++ Возврат указателя на локальный объект
Возвращение значения в функции, ссылки, вычислить корни квадратного уравнения C++
Ссылки на объект и мультипоточность C++
Сохранение ссылки на объект в векторе C++
Разъясните ситуацию с возвратом объекта или ссылки на объект C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.05.2012, 00:51     Возвращение ссылки на локальный объект #20
Цитата Сообщение от Bers Посмотреть сообщение
Статические переменные являются статическими, а не локальными
Дейтелы имеют другое мнение. И, мне кажется, они более компетентны.
Существует два типа идентификаторов со статическим классом памяти —
внешние идентификаторы (такие, как глобальные переменные и глобальные
имена функций) и локальные переменные, объявленные со спецификатором
класса памяти static.
Локальные переменные, объявленные с ключевым словом static, все равно
известны только в той функции, где они объявлены, но в отличие от
автоматических переменных сохраняют значения и после того, как функции возвратит
управление своему вызывающему.
Yandex
Объявления
15.05.2012, 00:51     Возвращение ссылки на локальный объект
Ответ Создать тему
Опции темы

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