Я выполняю некоторые вводные упражнения C ++, одно из которых: Что будет на экране после выполнения этого кода:
int& testMethod (int& a){
int c = a+a;
return c;
};
int main() {
int z = 5;
int* y = new int (testMethod(z));
int r = 25;
testMethod(r);
std::cout<<*y;
return 0;
}
Мои вопросы:
- Прав ли я, что это пример UB, поскольку значение, возвращаемое
testMethod
при втором вызове, не присваивается переменной? - Верно ли, что возвращаемое значение, хотя и не присвоенопеременная, все еще может быть восстановлена, но это зависит?
Для № 2, я просто пытаюсь подтвердить свое понимание того, как работает стек, что выглядит следующим образом.Когда функция возвращает значение и значение присваивается переменной, результат вычислений сначала сохраняется в стеке как retval
в некоторой ячейке памяти, а затем присваивается переменной, то есть записывается в другую ячейку памяти.Затем указатель стека перемещается вверх (опять же, насколько я понимаю, «верх» стека на самом деле является его «дном», когда указатель перемещается от самого большого адреса к наименьшему).Но retval
все еще существует некоторое время, пока не будет перезаписан другим фрагментом данных (что может произойти почти мгновенно).
Этот второй вопрос возник, когда я искал ответ на первый вопрос по SOи нашел эту ветку, так как два верхних (по голосам) сообщения отвечают по-разному.