Бесконечная рекурсия является распространенным способом получить ошибку переполнения стека. Для предотвращения - всегда удостоверяются, что существует путь выхода, который будет быть пораженным.:-)
Другой способ получить переполнение стека (в C/C++, по крайней мере) состоит в том, чтобы объявить некоторую огромную переменную на стеке.
char hugeArray[100000000];
Это сделает это.
Хорошо, у меня нет ответа для вас, но у меня есть несколько подсказок:
_S_create_c_locale
. То, что я нашел, находится в строке 143 файла config / locale / generic / c_locale.cc . В комментарии говорится: «В настоящее время универсальная модель поддерживает только локаль« C »». Это не многообещающе. Фактически, если я сделаю LANG = C
, ошибка выполнения исчезнет, но любое другое значение для LANG
, которое я попробую, вызовет ту же ошибку, независимо от того, какие аргументы я передать конструктору locale
. (Я пробовал locale :: classic ()
, «C», «» и значение по умолчанию). Это верно еще в GCC 4.0 Ничего из этого не говорит вам, почему локаль по умолчанию в 10.6 не будет работать с std :: locale
, но он предлагает обходной путь, который должен установить LANG = C
перед запуском программы.
Исключение _S_create_c_locale
, по-видимому, указывает на некоторую неправильную конфигурацию: проверьте, установлена ли ваша переменная среды LC_ALL
или LANG
to существует в выходных данных locale -a
.
$ env LC_ALL=xx_YY ./test terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_S_create_c_locale name not valid Aborted $ env LC_ALL=C ./test $ echo $? 0
Но поскольку вы работаете в OS X, я не совсем уверен, как предполагается обрабатывать информацию о локали.
У меня была та же проблема, я проверил LANG и LC_MESSAGES, и они не устанавливаются, когда вы запускаете приложение через Finder, поэтому следующие строки спасли положение:
unset("LANG");
unset("LC_MESSAGES");
Ситуация все та же. Но некоторая функциональность может быть получена с помощью
setlocale( LC_ALL, "" );
. Это дает вам возможность кодирования UTF-8 в широком потоке iostream
, но не форматирования денег для двух моих точек данных.
locale::global( locale( "" ) );
должен быть эквивалентен, но он дает сбой при последующем запуске в той же самой программе.