tgoop.com/cpp_geek/332
Create:
Last Update:
Last Update:
Невидимый UB: возвращаем ссылку на локальную переменную
Одна из самых коварных ошибок в C++ — возврат ссылки на переменную, срок жизни которой закончился. Казалось бы, всё компилируется, запускается... и даже иногда "работает". А под капотом — undefined behavior.
Пример:
const std::string& getName() {
std::string name = "John";
return name; // 💥 Возвращаем ссылку на локальный объект
}
Функция возвращает ссылку на
name
, но как только getName()
завершится, name
уничтожается. Ссылка указывает в никуда.Использование этой ссылки:
std::cout << getName() << "\n"; // UB: может напечатать мусор, может упасть
👀 Хитрость: такая ошибка часто прячется внутри более сложных функций, и ловится не сразу. Особенно в шаблонном коде или при рефакторинге.
🔒 Как безопасно?
* Возвращайте по значению, если объект небольшой или RVO (return value optimization) работает:
std::string getName() {
std::string name = "John";
return name; // ок, RVO устранит копирование
}
* Или передавайте результат через параметр:
void getName(std::string& out) {
out = "John";
}
💡 Профит: избежите UB, багов-призраков и бессонных ночей.
➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/332