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

时间:2014-08-05 03:54:43

标签: c++ c++11 segmentation-fault locale

我为以前的generate range for which std::isalpha evaluates to true问题建议了以下代码。它会显示char评估为isalpha的当前语言环境中的所有true,因此对于英语语言环境,它会显示AB...Zab...z。但是,在尝试访问Segmentation fault: 11时,我在if(table[i] & ctype::alpha)行上table了。我在OS X Mavericks 10.9.4上用g ++ 4.9和clang ++(Apple LLVM版本5.1(clang-503.0.40))编译了它。在所有其他平台(Linux / Solaris)上,它可以工作,没有分段错误。

任何人都可以指出在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;
}
PS:经过几个小时后,我发现(遵循霍华德的建议)clang ++默认采用了libstdc ++(为什么我还没找到),这似乎在语言环境支持方面被打破了。使用libc ++进行编译时,程序按预期工作。

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

我在OS X Mavericks 10.9.4上使用clang ++(Apple LLVM版本5.1(clang-503.0.40)),你的程序对我来说很好。我补充说:

assert(table != nullptr);
assert(table == facet.classic_table());

两个断言传递。编译:

clang++ test.cpp