Это не совсем ответ, но я мог бы уточнить поведение, в случае механизма RAII, которое я понял из другого ответа и комментариев Майка.
#include <iostream>
class Bar
{
public:
Bar() { std::cout << "Bar constructor" << std::endl; }
~Bar() { std::cout << "Bar destructor" << std::endl; }
};
void foo()
{
throw("Exception");
}
int main()
{
// Variation, add { to create a new scope
Bar bar;
foo();
// Variation : }
return 0;
}
Используя g++
, этот кодтам, где исключение не перехвачено, будет выведено следующее:
Bar constructor
terminate called after throwing an instance of 'char const*'
Aborted
Это означает, что g++
не разматывает стек (или не выводит переменную из области видимости, если я правильно понимаю «вариант»), поэтому деструктор не вызывается.
Однако, если вы поймаете исключение:
#include <iostream>
class Bar
{
public:
Bar() { std::cout << "Bar constructor" << std::endl; }
~Bar() { std::cout << "Bar destructor" << std::endl; }
};
void foo()
{
throw("Exception");
}
int main()
{
try
{
Bar bar;
foo();
}
catch (...)
{
// Nothing here
}
return 0;
}
, тогда будет вывод
Bar constructor
Bar destructor
, и вы восстановите правильныйповедение.