Когда я запускаю следующий исходный код, получаю «Ошибка сегментации (ядро сброшено)» в строке № 3
char s[] = "helloworld";
const std::collate<char>* pc = &std::use_facet<std::collate<char> >(std::locale("en_US"));
std::string str = pc->transform(s, s + std::strlen(s));
std::cout << str.length() << "," << str << std::endl;
Если я заменю строку № 2 с
const std::collate<char>* pc = new std::collate_byname<char>("en_US");
Я могу получить правильный результат.
Я думаю, что результат этих двух строк должен быть одинаковым, все они получают сопоставление из среды выполнения, так почему в первом возникла ошибка?
Я сделал что-то неправильно?
PS: компилятором c ++ является g ++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3).
Чтение документы о use_facet
:
Ссылка, возвращаемая этой функцией, действительна до тех пор, пока
std::locale
существует объект, который реализует Facet.
Вы создаете временный std::locale
в вашем коде, так что временное уничтожается в конце выражения, и у вас остается висячий указатель. Вот так это должно работать:
char s[] = "helloworld";
std::locale en_US("en_US");
const std::collate<char>* pc = &std::use_facet<std::collate<char> >(en_US);
std::string str = pc->transform(s, s + std::strlen(s));
std::cout << str.length() << "," << str << std::endl;
Других решений пока нет …