Подтвердить что ты не робот

Поведение деструктора С++

Я попробовал следующую программу на Visual Studio 2010.

#include <iostream>
using namespace std;

class A {
public:
        int p;

        /*A(){
            cout << "Constructor A" << endl;
        }*/

        ~A(){
            cout << "Destructor in A" << endl;
        }
};

class D: public A
{
public: 

        /*D(){
            cout << "Constructor D" << endl;
        }*/

        ~D(){
            cout << "Destructor in D" << endl;
        }
};

int main()
{
    D d =  D();
    cout << "Exiting main" << endl;
}

Выход, который я получил, -

Destructor in D
Destructor in A
Exiting main
Destructor in D
Destructor in A

Я не могу понять, почему деструктор класса D и A вызывается перед выполнением инструкции "Выход из основного"?

Я попробовал другое - я раскодировал конструктор класса D в приведенном выше коде, тогда вывод был как я ожидается -

Constructor D
Exiting main
Destructor in D
Destructor in A

Что мне здесь не хватает?

4b9b3361

Ответ 1

Линия

D d =  D();

сначала создает временный, неназванный объект, который затем копируется в d. То, что вы видите, это временный объект, который уничтожается, когда оператор завершается. Именованный объект d уничтожается, когда он выходит из области видимости, после завершения main().

Если вы добавите конструктор копирования в d, вы увидите, что он вызывается.

При комментировании конструктора я думаю, что вы видите ожидаемое поведение, потому что компилятор может сделать некоторые оптимизации.