Как известно если в конструкторе класса кидается исключение то объект не считается созданным и его деструктор не вызывается.
Рассмотрим такой класс:
class A
{
class B
{
public:
void operator =(char* v)
{
_v = v;
}
~B()
{
delete[] _v;
}
private:
char* _v;
};
B _b;
public:
A()
{
_b = new char[10];
throw 1;
}
~A()
{
std::cout << "~A()" << std::endl;
}
};
int main()
{
try
{
A a;
}
catch(...)
{
}
}
В этом случае утечки памяти не будет. Но почему будет вызван деструктор класса B? Откуда мы в него придем? Ведь объект его содержащий не будет разрушен.
Вот тут
A()
{
_b = new char[10];
раз вы не написали явный вызов конструктора для b_, будет вызван конструктор по умолчанию.
Можно было бы переписать этот кусок как
A():_b(new char[10])
{
конечно, написав соответствующий конструктор для B.
Конструктор класса b будет вызван при вызове конструктора класса A, потому что нужно инициализировать переменные класса. А потом здесь _b = new char[10]; будет вызван operator=.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости