OS X上的std :: locale segfault,无法在任何其他平台上重现

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 ++编译时,程序按预期工作.

use*_*267 7

不妨把我的评论转化为答案:

由于libstdc ++不支持OSX上的"通用"语言环境模型,因此几乎不支持C++语言环境.您的段错误是由facet.table();返回空指针引起的(标准实际上不允许这样做).

可悲的是,现在唯一的解决方案是完全远离OSX上的语言环境,或者转而使用libc ++,而@HowardHinnant指出它可以正常工作.