std :: collat​​e :: transform导致分段错误

时间:2014-02-17 08:11:04

标签: 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)。

1 个答案:

答案 0 :(得分:4)

阅读docs of use_facet

  

只要存在实现Facet的任何std::locale对象,此函数返回的引用都是有效的。

您正在代码中创建一个临时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;