vso*_*tco 5 c++ locale segmentation-fault c++11
我为以前的一个问题提出了以下代码:我的生成范围std :: isalpha评估为true.它显示char当前语言环境中isalpha计算结果的所有s true,因此对于显示的英语语言环境AB...Zab...z.但是,我在尝试访问时遇到了Segmentation fault: 11问题.我在OS X Mavericks 10.9.4上用g ++ 4.9和clang ++(Apple LLVM版本5.1(clang-503.0.40))编译了它.在所有其他平台(Linux/Solaris)上,它可以工作,没有分段错误.if(table[i] & ctype::alpha)table
任何人都可以指出在OS X上的C++的libc ++/libstdc ++中是否存在某些问题,或者至少问题是否可重现?
#include <iostream>
#include <locale>
int main() {
typedef std::ctype<char> ctype;
std::locale locale;
const ctype& facet = std::use_facet<ctype>(locale);
const ctype::mask* table = facet.table();
// You might skip this and work with the table, only.
std::string result;
for(unsigned i = 0; i < facet.table_size; ++i) {
if(table[i] & ctype::alpha)
result += char(i);
}
std::cout << result << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
PS:经过几个小时后,我发现(按照霍华德的建议),clang ++默认采用了libstdc ++(为什么我还没找到),这似乎在语言环境支持方面被打破了.使用libc ++编译时,程序按预期工作.
不妨把我的评论转化为答案:
由于libstdc ++不支持OSX上的"通用"语言环境模型,因此几乎不支持C++语言环境.您的段错误是由facet.table();返回空指针引起的(标准实际上不允许这样做).
可悲的是,现在唯一的解决方案是完全远离OSX上的语言环境,或者转而使用libc ++,而@HowardHinnant指出它可以正常工作.