这段代码似乎在 gcc 和 clang 的(ubuntu 可信)版本中工作正常,并且通过 mingw 在 VM 上的 Win 7 中工作正常......最近我升级到 Wily 并使用 clang 构建的版本始终崩溃。
#include <iostream>
#include <locale>
#include <string>
int main() {
std::cout << "The locale is '" << std::locale("").name() << "'" << std::endl;
}
有时它是一个乱码字符串,后面跟着Aborted: Core dumped
有时它的invalid free
.
$ ./a.out
The locale is 'en_US.UTF-8QX�у�X�у����0�����P�����\�(��\�(��\�(��h��t�������������y���������ț�ԛ�������en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_UP����`�������������������������p�����������@��������������`�������������p��������������������@��@��@��`��������p������������0��P��p���qp��!en_US.UTF-8QЈ[�����\�(��\�(��\�(�����������@�� �����P�����0�����P�����\�(��\�(��\�(��Ȣ�Ԣ����������������(��4��@��L��en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8!�v[��������������@�� �����P�����0�����P�����\�(��\�(���(��h��t��������������������Ȥ�Ԥ�������en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8!��[�� ����[�������7����7��.,!!x�[��!��[��!�[��@�����������@�� �����P�����0�����P�����\�(��\�(��\�(��(��4��@��L��X��d��p��|������������n_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8ѻAborted (core dumped)
$ ./a.out
The locale is 'en_US.UTF-8QX\%�QX\%�Q�G�0H��H�PI��I�\:|�Q\D|�Q\>|�QhK�tK��K��K��K��K��Q�K��K��K��K��K��K�en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8en_US.UTF-8ѻ
*** Error in `./a.out': free(): invalid pointer: 0x0000000000b04a98 ***
Aborted (core dumped)
(上面的两个程序输出都被大大缩写,否则它们不适合这个问题。)
我还得到了一个在 Coliru 上免费无效 http://coliru.stacked-crooked.com/a/a05c98f8206ca178也有它。
但这与示例代码非常相似参考参数 http://en.cppreference.com/w/cpp/locale/locale:
#include <iostream>
#include <locale>
#include <string>
int main()
{
std::wcout << "User-preferred locale setting is " << std::locale("").name().c_str() << '\n';
// on startup, the global locale is the "C" locale
std::wcout << 1000.01 << '\n';
// replace the C++ global locale as well as the C locale with the user-preferred locale
std::locale::global(std::locale(""));
// use the new global locale for future wide character output
std::wcout.imbue(std::locale());
// output the same number again
std::wcout << 1000.01 << '\n';
}
其实那个代码科利鲁崩溃 http://coliru.stacked-crooked.com/a/94d30d32ef961435还有……:捂脸:
More http://coliru.stacked-crooked.com/a/443f20019b661ecd crashes http://coliru.stacked-crooked.com/a/cc5bc8edaa2007f5来自 Coliru 的类似代码。
这是 clang 使用的 C++ 库中的错误,还是这段代码有缺陷?
另请注意:如果您使用,这些崩溃似乎仅限于 C++ api<clocale>
相反,事情似乎工作正常,所以这可能只是 C++ 绑定中的一些小问题?
变体使用setlocale
: 1 http://coliru.stacked-crooked.com/a/ea5d2c5d992a79b2 2 http://coliru.stacked-crooked.com/a/53964c214bae870d 3 http://coliru.stacked-crooked.com/a/c84d909cabec4eea