c++ - std::collat​​e::transform 导致段错误

标签 c++ locale collate

当我运行以下源代码时,在第 3 行出现“Segmentation fault (core dumped)”

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)。

最佳答案

阅读docs of use_facet :

The reference returned by this function is valid as long as any std::locale object exists that implements 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;

关于c++ - std::collat​​e::transform 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823822/

相关文章:

c++ - 使用 boost::program_options 的首选跨平台 'main' 定义是什么?

c++ - 从部分专用模板类创建对象

android - 无法将字符串转换为西类牙语日期

c++ - 如何获取 std::locale 的日期和时间的当前 "localized pattern"

c++ - C++中的动态继承

c++ - 将数组传递给接受 arg-list 中的双指针的函数

python - SQLITE 自定义 Accent 排序规则函数和 LIKE 查询

java - 快速更改Android系统语言

sql-server-2008 - 如何使用LIKE执行区分大小写的搜索?