У меня есть функция, которую можно свести к следующему:
void f() {
static MyObject o("hello");
DoSomethingWith(o);
}
Эта функция вызывается через границу C API поэтому, как хороший мальчик, я использую try
, чтобы перехватывать любые исключения, которые генерируются до того, как они пересекают границу и облажаются:
void f() {
try {
static MyObject o("hello");
DoSomethingWith(o);
} catch (const MyObjectException& e) {
Message("Constructor of o failed");
}
}
Эта функция вызывается в первый раз, и я получаю сообщение "Конструктор o не удалось"
. Однако позже функция вызывается снова, и я снова получаю сообщение. Я получаю сообщение столько раз, сколько вызывается f
. Я использую Visual C ++, поэтому это говорит мне о том, что делает MSVC ++, но не о том, что следует делать.
Мой вопрос: что должно произойти, когда конструктор static
функциональной переменной завершается необычным образом (из-за throw
ing, a longjmp
из конструктора, завершение потока, в котором он находится, и т. д.)? Также что должно произойти с любыми другими статическими
переменными, объявленными до и после него? Я также был бы признателен за любые соответствующие цитаты из стандарта.