1

当我运行以下源代码时,在第 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)。

4

1 回答 1

4

阅读以下文档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;
于 2014-02-17T08:27:38.317 回答