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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от lazybiz Посмотреть сообщение
Если речь идет о возвращении ссылки на локальную переменную, то компилятор выдает предупреждения, что, на самом деле, правильно с его стороны.
Он пропускает некорректный код. Правильно он должен был бы его запретить (ошибка времени компиляции).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:46
Пригодится что? Уточняй.
Про возврат ссылки на локальную не статическую переменную
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
15.05.2012, 01:47
Билдер это мутант какой-то. В чем смысл? Давай без оффтопа.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
15.05.2012, 01:47
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2012, 01:47

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru