Назад к вопросам
JuniorДебаггингОчень часто
Что произойдёт, если вернуть ссылку на локальный объект?
#include <iostream>
const int& make_counter() {
int count = 0;
return count;
}
int main() {
const int& c = make_counter();
std::cout << c;
}Неопределённое поведение: count уничтожена при возврате, и ссылка c стала висячей
- Ждать, что ссылка продлит жизнь
count: время жизни локальной переменной не продлевается послеreturn, и чтениеc— неопределённое поведение. - Ждать ошибку компиляции: GCC и Clang по умолчанию, даже без
-Wall, только предупреждают, и программа собирается.
- Как пропуск копирования (RVO/NRVO) делает дешёвым возврат большого объекта по значению?
- Безопасен ли возврат ссылки на
static-локальную переменную в многопоточной программе?
Исправление
Ссылка c обозначает count, а count уничтожается при выходе из make_counter. Верните int по значению: main получит копию, которая живёт столько, сколько нужно.
#include <iostream>
int make_counter() {
int count = 0;
return count;
}
int main() {
int c = make_counter();
std::cout << c; // 0
}