Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/51: Рейтинг темы: голосов - 51, средняя оценка - 4.73
Заблокирован
1

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

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

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

C++
1
2
3
4
5
6
int& foo()
{
    int a;
    //: warning C4172: возвращение адреса локальной или временной переменной
    return a;  
}
Компиляторы подобный бред ловят без проблем. Технически препятствий не существует. Назови хоть одну реальную причину, по которой сие разрешено стандартом?
 Комментарий модератора 
Спор родился тут
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2012, 22:00
Ответы с готовыми решениями:

Возможно ли возвращение функцией двух значений? Именно возвращение, не ссылка или указатель
Нужна функция в которую забиваешь два числа и сначала она возвращает минимальное, после...

Локальный объект
Вместо синусоиды у меня выводиться мусор. Помогите найти ошибку:help: Вот часть кода void...

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

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

45
Заблокирован
15.05.2012, 00:52  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Toshkarik Посмотреть сообщение
Дейтелы имеют другое мнение.
Дейтлы объясняют что такое класс памяти static?
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.05.2012, 00:54 22
Цитата Сообщение от Bers Посмотреть сообщение
Дейтлы объясняют что такое класс памяти static?
Именно так. Глава называется "Классы памяти".
0
Заблокирован
15.05.2012, 01:01  [ТС] 23
Цитата Сообщение от Toshkarik Посмотреть сообщение
Именно так. Глава называется классы памяти.
Тогда ты знаешь, что область видимости статической переменной не имеет никакого отношения ни к времени жизни этой переменной, ни к стеку.

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

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

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

Цитата Сообщение от Bers Посмотреть сообщение
5. Не путай статические данные с локальными.
Никогда не путал. Прекрасно представляю в чем разница. Похоже даже лучше чем ты.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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;
}
//---------------------------------------------------------------------------
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.05.2012, 01:15 26
Цитата Сообщение от Avazart Посмотреть сообщение
Имеется ввиду что то типо этого?
Да, что-то вроде.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.05.2012, 01:16 27
Цитата Сообщение от Bers Посмотреть сообщение
никакого отношения
Я и не говорил ничего подобного. Я лишь сказал, что локальная переменная на то и локальная, что к ней можно непосредственно обращаться по имени только в определенных местах, в данном случае в пределах функции, или, более широко, в пределах первых внешних фигурных скобок.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:16 28
Да, что-то вроде.
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.05.2012, 01:18 29
Цитата Сообщение от lazybiz Посмотреть сообщение
Да, что-то вроде.
Вам уже ответили, что возвращать ссылку на статический объект можно, ни компилятор ни стандарт "не будет против".
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.05.2012, 01:22 30
Цитата Сообщение от Avazart Посмотреть сообщение
Ну тогда это имеет смысл не смотря на то что это можно реализовать иначе что для с++ норма
Не понял о чем ты. Без пунктуации читать невозможно.

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

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

Речь идет о локальных.
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
15.05.2012, 01:27 32
Ну как я понял, народ хочет, чтоб компилятор выдавал ошибку в этом месте, и это было бы "по стандарту".
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.05.2012, 01:38 33
Цитата Сообщение от Bers Посмотреть сообщение
А вот стандарт языка позволяет.
Так и речь об этом. И я пытаюсь доказать что это не просто так сделано.

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

Добавлено через 3 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Речь идет о локальных.
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:39 34
Хорошо, а если подумать где это может пригодиться?
Может для каких нибуть низкоуровневых операций, либо просто это наследие си?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.05.2012, 01:40 35
Цитата Сообщение от Avazart Посмотреть сообщение
Хорошо, а если подумать где это может пригодиться?
Пригодится что? Уточняй.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:44 36
Народ хочит Builder?
Миниатюры
Возвращение ссылки на локальный объект  
0
Заблокирован
15.05.2012, 01:46  [ТС] 37
Цитата Сообщение от lazybiz Посмотреть сообщение
И я пытаюсь доказать что это не просто так сделано.
В третий раз задаю этот вопрос: для чего может быть нужно возвращать ссылку на локальный или временный объект?

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

Цитата Сообщение от lazybiz Посмотреть сообщение
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
Он пропускает некорректный код. Правильно он должен был бы его запретить (ошибка времени компиляции).
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:46 38
Пригодится что? Уточняй.
Про возврат ссылки на локальную не статическую переменную
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.05.2012, 01:47 39
Билдер это мутант какой-то. В чем смысл? Давай без оффтопа.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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();
}
передача параметров из функции в функцию
Бред полнейший но работает
но стоит взять другой оптимизатор может(скорее всего) и не сработать
0
15.05.2012, 01:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 01:47
Помогаю со студенческими работами здесь

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

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

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

Возвращение ссылки на указатель использование её как левостороннего значения
Есть шаблон: //------------------------------------------------------- template&lt;class T&gt; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru