Глядя в интернете на мозги С ++, я нашел этот пример:
#include <iostream>
using namespace std;
class A {
public:
A()
{
cout << "A::A()" << endl;
}
~A()
{
cout << "A::~A()" << endl;
throw "A::exception";
}
};
class B {
public:
B()
{
cout << "B::B()" << endl;
throw "B::exception"; // <- crashes here
}
~B()
{
cout << "B::~B()";
}
};
int main(int, char**) {
try
{
cout << "Entering try...catch block" << endl;
A objectA;
B objectB;
cout << "Exiting try...catch block" << endl;
}
catch (const char* ex)
{
cout << ex << endl;
}
return 0;
}
Это то, что я думал, что программа будет делать:
- A :: A () будет выводиться на экран при вызове конструктора objectA. Объект А успешно построен.
- B :: B () будет выводиться на экран при вызове конструктора объекта B.
- Затем конструктор B генерирует исключение. Объект B не построен успешно.
- Деструктор объекта B не вызывается, поскольку конструктор никогда не завершался успешно.
- Деструктор объекта A будет вызываться при выходе объекта из области действия при выходе из блока try.
Однако, когда я запустил программу, она фактически вылетела в строке, отмеченной знаком <-. Кто-нибудь может объяснить, что именно происходило в тот момент? </p>