OS X上的std::locale段错误,不能在任何其他平台上重现
std::locale segfault on OS X, cannot reproduce on any other platform
对于我之前的一个问题,我建议使用以下代码生成std::isalpha求值为true的范围。它显示当前语言环境中isalpha
求值为true
的所有char
,因此对于英语语言环境,它显示AB...Zab...z
。然而,当试图访问table
时,我在if(table[i] & ctype::alpha)
线上获得Segmentation fault: 11
。我在OS X Mavericks 10.9.4上使用g++4.9和clang++ (Apple LLVM version 5.1 (clang-503.0.40))编译它。在所有其他平台上(Linux/Solaris),它工作,没有分割错误。
有没有人可以指出,如果有什么东西在c++的libc++/libstdc++在OS X上,或者至少如果问题是可重复的?
#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:几个小时后,我发现(按照Howard的建议)clang++默认使用libstdc++(为什么我还没有发现),这似乎在语言环境支持方面被打破了。当使用libc++编译时,程序按照预期工作。
不妨把我的评论变成一个答案:
由于libstdc++不支持OSX上的"通用"区域设置模型,因此几乎不支持c++区域设置。你的段错误是由facet.table();
返回一个空指针引起的(这实际上是不允许的标准)。
遗憾的是,目前唯一的解决方案是完全远离OSX上的区域设置,或者切换到libc++,正如@HowardHinnant指出的那样工作得很好。
我在OS X Mavericks 10.9.4上使用clang++ (Apple LLVM version 5.1 (clang-503.0.40)),您的程序对我来说工作得很好。我说:
assert(table != nullptr);
assert(table == facet.classic_table());
和两个断言都通过。编译:
clang++ test.cpp
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 带有 std::的任何值unordered_map不能any_cast字符串
- C++:强制实施函数,使其不能接受按值传递的任何参数
- OpenGL 3.3不能绘制任何东西
- 为什么我的可变参数宏不能正确接受任何参数?
- 为什么这段代码不能正常工作???我的意思是,为什么当我运行它时它没有显示任何内容?
- 什么不能接受字符串向量并用 offest 和 assigmnet 运算符替换任何字符串的字符?
- 提升::任何不能投射回 标准::函数
- 涡轮增压C++增量卡在我的总线号中为 2。请帮助我,不能使用任何编译器只是涡轮增压C++
- OS X上的std::locale段错误,不能在任何其他平台上重现
- 语句调用构造函数,但对构造函数不做任何操作——为什么它不能编译
- 不能在我的程序中使用 "gst_tag_id3_genre_count()" 或任何其他与 id3 相关的 API
- 能够编译和运行.然而,当运行代码时,它不能打印我想打印的任何值
- ICMPv6 -不能读取任何路由器通告消息
- OpenCV videoccapture在Windows 7 32位系统中不能读取任何视频文件
- Visual Studio 2010 c++ SDL游戏可以在它编译的计算机上运行,但不能在任何其他计算机上运行
- Qt Creator不能构建任何东西
- 为什么我不能再为数组分配任何东西