toUTF8String и локальная ссылка

56
3

http://www.icu-project.org/apiref/icu4c/classicu_1_1UnicodeString.html#a05777d826515a20a0b2bb8f4108f9348

StringClass & toUTF8String (StringClass & result) const

Преобразуйте UnicodeString в UTF-8 и добавьте результат в стандартную строку.

Параметры: result Стандартная строка (или совместимый объект), к которой добавлена версия строки UTF-8.

Возвраты: строковый объект.

// My own function.
string toStdString(const UnicodeString& a_str)
{
string str;
a_str.toUTF8String(str);
return (str);
}
int main (void)
{
string a = toStdString("a");
string b = toStdString("b");

cout << "a:" << a << endl; // a
cout << "b:" << b << endl; // b

const char* a1 = toStdString("a").c_str();
const char* b1 = toStdString("b").c_str();

cout << "a1:" << a1 << endl; // b !!! Problem: Why not "a"?
cout << "b1:" << b1 << endl; // b

const char* a2 = a.c_str();
const char* b2 = b.c_str();

cout << "a2:" << a2 << endl; // a
cout << "b2:" << b2 << endl; // b

return (0);
}

спросил(а) 2013-04-07T12:32:00+04:00 7 лет, 5 месяцев назад
1
Решение
57

Функция toStdString возвращает временную, которая исчезает, если вы ее где-то не храните.

В этом утверждении

const char* a1 = toStdString("a").c_str();

вы храните указатель на этот временный объект. В конце инструкции эта временная строка снова уничтожается, а указатель не указывает нигде.

Попытка использовать указатель позже приводит к неопределенному поведению, и все может произойти, включая отображение другой строки.

ответил(а) 2013-04-07T12:48:00+04:00 7 лет, 5 месяцев назад
41

Это не имеет ничего общего с ICU, а скорее, что вы храните указатель на временный объект. Когда вы звоните

const char* a1 = toStdString("a").c_str();

toStdString возвращает string объект, затем вы вызываете c_str на int, который возвращает временный указатель на его содержимое. После уничтожения string объекта указатель недействителен и не должен использоваться. В вашем случае следующий вызов c_str вероятно, вернул тот же самый указатель на временный объект, перезаписав предыдущий.

ответил(а) 2013-04-07T12:53:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема