Справочная ошибка C++

Я попытался понять, как работают ссылки на C++, и попытался написать следующий код:

#include <iostream>
int& func();
int main()
{
    std::cout <<func()<< std::endl;
    system("pause");
    return 0;
}

 int& func()
{
    int x = 23;
    return x;
}

Насколько я понимаю, int x, который был инициализирован в функции, будет удален после завершения функции, а затем значение, которое возвращает функция, будет указывать на то, чего не существует. Но когда я его распечатываю, в консоли получается 23. Как это возможно?

неопределенное поведение не определено.
George 27.10.2018 14:13

Что вы ожидали?

n. 1.8e9-where's-my-share m. 27.10.2018 14:14

Я ожидал, что компиляция не удастся, потому что значение, возвращаемое функцией, является ссылкой на то, чего не существует. можешь объяснить, где я не прав?

Liroshka 27.10.2018 14:22

Если вы повысите уровень предупреждений компилятора (что вам следует сделать) и будете рассматривать все предупреждения как ошибки (что настоятельно рекомендуется), во многих таких случаях вы получите предупреждение / ошибку. Но не во всех случаях. В конечном итоге вы несете ответственность за то, чтобы не возвращать висящую ссылку. Компилятор не всегда может этого гарантировать.

n. 1.8e9-where's-my-share m. 27.10.2018 14:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение записано в памяти внутри func(), но вы ошиблись, сказав "не существует" после возврата. Почему бы этого не было, неужели что-нибудь еще перезаписало эту память? Вы не можете быть уверены. Это неопределенное поведение.

Вы просто возвращаете адрес памяти из func(), который после возврата становится доступным для других переменных. Но если этот (теперь доступный) адрес памяти не будет перезаписан, он будет содержать значение 23 .. До конца дней;)

Вот ссылка @George на неопределенное поведение: https://en.cppreference.com/w/cpp/language/ub

Кроме того, в вашем коде могут быть ошибки ... В любом случае, посмотрите на это, и это решит ваши проблемы. Можно ли получить доступ к памяти локальной переменной вне ее области?

@ Лирошка, как дела?

niCk cAMel 27.10.2018 14:25

то же самое относится к этому?: pastebin.com/7AJcteYn

Liroshka 27.10.2018 14:28

@Liroshka Нет, это другое, но пони на утечку памяти.

πάντα ῥεῖ 27.10.2018 14:29

чем он отличается?

Liroshka 27.10.2018 14:29

@Liroshka Вы динамически распределяете необходимую память? Это имеет большое значение.

πάντα ῥεῖ 27.10.2018 14:30

Что отличается? что даже после завершения функции это значение не будет отменено?

Liroshka 27.10.2018 14:32

@Liroshka Ссылки читали?

niCk cAMel 27.10.2018 14:35

Почему я даже попытался ответить на этот вопрос .. Конечно, отрицательный голос не понадобился, учитывая мою скромную репутацию

niCk cAMel 27.10.2018 14:36

@Liroshka Если вас не устраивают ответы из дубликата, пожалуйста, уточните и улучшите свой вопрос, вместо того, чтобы тратить время на бесконечные обсуждения комментариев.

πάντα ῥεῖ 27.10.2018 14:38

Другие вопросы по теме