Не вызывается деструктор

Весь код:

#include <iostream>
 
using namespace std;
 
class MyClass
{
public:
    int data;
    MyClass(int data)
    {
        this->data = data;
        cout << "Вызвался конструктор " << this << '\n';
    }
    ~MyClass()
    {
        cout << "Вызвался деструктор " << this << '\n';
    }
};
void Foo(MyClass value)
{
    cout << "Вызвалась функция Foo " << '\n';
}
MyClass Foo2()
{
    cout << "Вызвалась функция Foo2 " << '\n';
    MyClass temp(2);
 
    return temp;
}
int main()
{
    setlocale(LC_ALL, "ru");
 
    //MyClass a(1);
    //Foo(a);
    Foo2();
 
    return 0;
}

В моменте в

return temp;

не вызывается второй деструктор как должно быть по словам автора одного программиста. Почему не вызывается второй деструктор?


Ответы (1 шт):

Автор решения: Harry

Дело оптимизатора — применить NVRO или нет.

Компилирую ваш код в VC++ 2019 с ключиками

/std:c++latest /O2 /Ot /Oi /Ox /Oy /Ob2

ну, т.е. полная оптимизация. На выходе:

Вызвалась функция Foo2 
Вызвался конструктор 0000007982EFF920
Вызвался деструктор 0000007982EFF920

Теперь компилирую с

/std:c++latest /Od

и получаю

Вызвалась функция Foo2 
Вызвался конструктор 000000E0FD0FF904
Вызвался деструктор 000000E0FD0FF904
Вызвался деструктор 000000E0FD0FF940

Думаю, дальше пояснять ничего не надо?

Кстати, если возвращать просто

MyClass Foo2()
{
    cout << "Вызвалась функция Foo2 " << '\n';
    return 2;
}

то конструктор-деструктор будут и при оптимизации.

→ Ссылка