【发布时间】:2014-08-05 03:54:42
【问题描述】:
我为我的上一个问题generate range for which std::isalpha evaluates to true 建议了以下代码。它显示当前语言环境中的所有chars,isalpha 的计算结果为true,因此对于英语语言环境,它显示AB...Zab...z。但是,当我尝试访问table 时,我在if(table[i] & ctype::alpha) 线上收到了Segmentation fault: 11。我在 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++ 编译时,程序按预期运行。
【问题讨论】:
-
facet.table();在这种情况下将返回classic_table(),因为您使用的是默认的 C 语言环境,它是 OSX 的空指针。遗憾的是,OSX 上的 C++ 语言环境支持非常少。 -
这里的教训是:始终检查函数返回值是否有效。
-
@user657267,谢谢!我想知道为什么我还没有检查
nullptr... 有什么特殊原因导致 OS X 不正确支持语言环境吗? -
@JoachimPileborg 课程学得不够好:)
-
@vsoftco GCC on OSX 只能使用
generic语言环境模型编译,因为不支持gnu模型。我猜这同样适用于 Clang。generic模型仅对语言环境提供准系统支持(几乎所有你得到的都是默认的 C 语言环境)。关于检查指针,这是一个诚实的错误,根据标准,返回值应该是一个长度为table_size的数组,并且实现似乎不允许任何异常来提供自己的行为。
标签: c++ c++11 segmentation-fault locale