Исключение в конструкторе

285
03 июня 2018, 12:10

Как известно если в конструкторе класса кидается исключение то объект не считается созданным и его деструктор не вызывается.

Рассмотрим такой класс:

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? Откуда мы в него придем? Ведь объект его содержащий не будет разрушен.

Answer 1

Вот тут

A()
{
    _b = new char[10];

раз вы не написали явный вызов конструктора для b_, будет вызван конструктор по умолчанию.

Можно было бы переписать этот кусок как

A():_b(new char[10])
{

конечно, написав соответствующий конструктор для B.

Answer 2

Конструктор класса b будет вызван при вызове конструктора класса A, потому что нужно инициализировать переменные класса. А потом здесь _b = new char[10]; будет вызван operator=.

READ ALSO
Не работает код из методички [закрыт]

Не работает код из методички [закрыт]

Скопировал код из методички по C++Компилятор выдает 91 ошибку

348
оператор извлечения &gt;&gt; и вставки &lt;&lt;

оператор извлечения >> и вставки <<

Как Перегрузить оператор извлечения >> и вставки << для объектов данного класса

264
QML. Получить элемент при клике

QML. Получить элемент при клике

Как получить элемент на который кликнули? Есть функция ChildAT, но она не возвращает абсолютно любой элемент, если присутствует вложенность(row,column...

206