std :: collate :: transform вызвал ошибку сегментации

Когда я запускаю следующий исходный код, получаю «Ошибка сегментации (ядро сброшено)» в строке № 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).

1

Решение

Чтение документы о 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;
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector