Назад к вопросам
JuniorДебаггингЧасто
Что произойдёт, если собрать и запустить эту программу?
#include <iostream>
#include <string>
#include <string_view>
std::string make_name() {
return "Ada";
}
int main() {
std::string_view name = make_name();
std::cout << name << '\n';
}Неопределённое поведение: временная строка уничтожена сразу после объявления name
- Ждать
Ada, будто представление продлевает жизнь строки: оно лишь смотрит на чужие символы, а они уничтожены, поэтому чтениеname— неопределённое поведение. - Ждать, что
string_viewскопирует символы: он хранит только адрес первого символа и длину, а сами символы уничтожены вместе с временной строкой.
- Почему ссылка
const std::string& name = make_name();безопасна, аstring_view— нет? - Когда
std::string_viewлучше подходит для параметра, чемconst std::string&?
Исправление
name смотрит на символы временной строки, а она уничтожается сразу после объявления name. Сохраните результат в std::string: такая переменная владеет своими символами и живёт до конца main.
#include <iostream>
#include <string>
std::string make_name() {
return "Ada";
}
int main() {
std::string name = make_name();
std::cout << name << '\n'; // Ada
}