Когда я запускаю следующий исходный код, получил «ошибки сегментации (ядро сбрасывали)» на линии № 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).
Спасибо, это работает. – songyuanyao
Я ошибочно считал, что 'std :: locale (" en_US ")' будет глобальным объектом, но только 'std :: locale()' и 'std :: locale :: classic()' глобальны на самом деле , – songyuanyao
@songyuanyao Чтобы выразить это точно: объект 'std :: locale' - это просто немой (ish) набор указателей на грани, причем сами грани являются ссылочными. 'classic()' возвращает фактическую ссылку C++ для глобального экземпляра C-locale, в то время как пустой 'std :: locale' ctor возвращает копию глобальной локали (увеличивая количество ссылок на ее грани). Построение другого языкового стандарта даст вам объект локали, грани которого (потенциально) используются только этим объектом - ref. count 1. Потеряйте этот объект и грани вниз до 0 и уничтожайте. – Angew