Я попытался понять, как работают ссылки на 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. Как это возможно?
Что вы ожидали?
Я ожидал, что компиляция не удастся, потому что значение, возвращаемое функцией, является ссылкой на то, чего не существует. можешь объяснить, где я не прав?
Если вы повысите уровень предупреждений компилятора (что вам следует сделать) и будете рассматривать все предупреждения как ошибки (что настоятельно рекомендуется), во многих таких случаях вы получите предупреждение / ошибку. Но не во всех случаях. В конечном итоге вы несете ответственность за то, чтобы не возвращать висящую ссылку. Компилятор не всегда может этого гарантировать.
Значение записано в памяти внутри func()
, но вы ошиблись, сказав "не существует" после возврата.
Почему бы этого не было, неужели что-нибудь еще перезаписало эту память? Вы не можете быть уверены. Это неопределенное поведение.
Вы просто возвращаете адрес памяти из func()
, который после возврата становится доступным для других переменных. Но если этот (теперь доступный) адрес памяти не будет перезаписан, он будет содержать значение 23 .. До конца дней;)
Вот ссылка @George на неопределенное поведение: https://en.cppreference.com/w/cpp/language/ub
Кроме того, в вашем коде могут быть ошибки ... В любом случае, посмотрите на это, и это решит ваши проблемы. Можно ли получить доступ к памяти локальной переменной вне ее области?
@ Лирошка, как дела?
то же самое относится к этому?: pastebin.com/7AJcteYn
@Liroshka Нет, это другое, но пони на утечку памяти.
чем он отличается?
@Liroshka Вы динамически распределяете необходимую память? Это имеет большое значение.
Что отличается? что даже после завершения функции это значение не будет отменено?
@Liroshka Ссылки читали?
Почему я даже попытался ответить на этот вопрос .. Конечно, отрицательный голос не понадобился, учитывая мою скромную репутацию
@Liroshka Если вас не устраивают ответы из дубликата, пожалуйста, уточните и улучшите свой вопрос, вместо того, чтобы тратить время на бесконечные обсуждения комментариев.