Задать вопрос
@Quad_Tree

Как сохранить копию string?

Есть функция Add, которая принимает в себя пару string_view и сохраняет их в некоторый контейнер для последующего доступа.
void Translator::Add(string_view source, string_view target) { .... }

Проблема в том, что в функцию Add при вызове может быть передана временная строка:
Translator::Add(string("first"), string("second"));

В таком случае Translator будет хранить в себе пару string_view, которые будут ссылаться на уже удалённые строки. Я решил сохранить копии строк в vector строк (который лежит в этом же Translator):
void Translator::Add(string_view first, string_view second) {
data.emplace_back(first);
first = data.back();
data.emplace_back(second);
second = data.back();
// ...
}

Но если к примеру я при вызове передаю string("okno"), string("windows"), то по какой-то причине first принимает значение "\000kno". Почему так происходит?

Более того, хранимые string_view повреждаются после первого вызова Translator:Add(). То есть их значения становятся что-то вроде "\000\000\000".

Как лучше сохранять копию строк?
  • Вопрос задан
  • 366 просмотров
Подписаться 1 Простой 11 комментариев
Решения вопроса 1
@Quad_Tree Автор вопроса
Не стоило использовать vector для хранения копий строк. vector при push_back может реаллоцировать память и в результате хранимые string_view будут ссылаться на удалённые строки. Лучше использовать deque, а ещё лучше использовать set (так как он гарантирует, что Translator не будет хранить в себе дубликаты строк, что позволит сэкономить память).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Вам не надо использовать std::string_view, до тех пор, пока вы не разберётесь, что это такое.
std::string_view -- это не владеющий объект. Он валиден до тех пор, пока живёт объект, на который он ссылается.

Вам же нужен вектор просто строк std::string. Ну и функцию поменять на что-то вроде:
void Translator::Add(std::string first, std::string second) 
{
    data.push_back(std::move(first));
    // ...
}

Можете даже оставить вашу функцию как есть, но вектор должен хранить именно копии строк, т.е. объекты std::string.
Ответ написан
DanielDemidko
@DanielDemidko
Программист
https://medium.com/@sshambir/std-string-view-%D0%B...

Вот в этой статье содержится ответ на ваш вопрос
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы