[C++] конструкторы, наследование, ислкючения
можно
как?
Например:
#include <iostream>
class A
{
private:
int i;
public:
explicit
A (int const i) :
i (i)
{
std::cout << "A::A (int const i); i = " << i << '\n';
}
~A
{
std::cout << "A::~A ; i = " << i << '\n';
}
};
class B : public A
{
private:
A a1;
A a2;
A * a3;
public:
B :
A (0
a1 (1
a2 (2)
{
std::cout << "B::B \n";
a3 = new A (3);
std::cout << "throw\n";
throw 0;
}
~B
{
std::cout << "B::~B \n";
}
};
int
main
{
try
{
B const b;
}
catch (...)
{
return 1;
};
return 0;
}
В данном случае, частями B являются: его предок A, и члены a1 и a2. (* a3) частью не является.
Т.о. после выкидывания исключения будут вызваны: b.a2.~A b.a1.~A b.~A :
A::A (int const i); i = 0
A::A (int const i); i = 1
A::A (int const i); i = 2
B::B
A::A (int const i); i = 3
throw
A::~A ; i = 2
A::~A ; i = 1
A::~A ; i = 0
его деструктор не будет вызван даже если инициализировать a3 в списке инициализации:
...
B :
A (0
a1 (1
a2 (2
a3 (new A (3
{
std::cout << "B::B \n";
std::cout << "throw\n";
throw 0;
}
...
Просвяти. почему без ty/catch(...) деструкторы вызваны не будут?
Просвяти. почему без ty/catch(...) деструкторы вызваны не будут?
В смысле в main?
Потому что тогда не будет ни одного обработчика исключений.
"Ах, у вас нет обработчика исключений?! А кто же будет раскручивать стек и вызывать деструкторы?! Ах вот вы как! Ну получайте abort !"
Оставить комментарий
oleg1331
есть иерархия классов. класс A наследуется классом B. Причем класс B помимо этого может наследовать еще классы, и в каком порядке вызываются конструкторы базовых - не известно. Но известно, что среди них есть классы, которые при инициализации выделяют память.Теперь вопрос. В конструкторе класса A вдруг генерируется исключение. Как после этого грамотно удалить (желательно автоматически, т.е. не выходя за пределы классов - без участия пользователя в основном коде) всю выделенную память? Т.е. деинициализировать все инициализированные объекты. Хорошо бы вызвать у них у всех деструкторы, но можно и как-нибудь по-другому.