Вы получаете аварийное завершение программы?
Я верю, что ваш CCriticalSection
объект будет освобожден деструктором CSingleLock
. Деструктор будет вызываться всегда, так как это объект в стеке. Когда выбрасывает код пользователя, все стеки между throw
и перехватчиком в вашей функции будут разматываться.
Однако есть вероятность, что какой-то другой объект в вашем пользовательском коде или даже деструктор CSingleLock
выдал еще одно исключение. В этом случае объект m_CriticalSection
не будет освобожден должным образом, и будет вызван std::terminate
, и ваша программа умрет.
Вот пример для демонстрации. Примечание: я использую функцию обработчика std::terminate
, чтобы уведомить меня о состоянии. Вы также можете использовать std::uncaught_exception
, чтобы увидеть, есть ли какие-либо необъяснимые исключения. Здесь есть хорошее обсуждение и пример кода здесь .
struct S {
S() { std::cout << __FUNCTION__ << std::endl; }
~S() { throw __FUNCTION__; std::cout << __FUNCTION__ << std::endl; }
};
void func() {
try {
S s;
{
throw 42;
}
} catch(int e) {
std::cout << "Exception: " << e << std::endl;
}
}
void rip() {
std::cout << " help me, O mighty Lord!\n"; // pray
}
int main() {
std::set_terminate(rip);
try {
func();
}
catch(char *se) {
std::cout << "Exception: " << se << std::endl;
}
}
Читайте это FAQ для ясности.
Можно ли решить эту проблему, поместив CSingleLock за пределы блока try?
Трудно сказать, не глядя на стек и ошибки (с) / сбои. Почему бы тебе не попробовать? Это может также внести небольшую ошибку, скрывая реальную проблему.