Почему выводится фраза в первом случае три раза, а во втором 1 раз?(Деструктор)

#include <iostream>
using namespace std;
class Myclass{
    public:
        Myclass(){
            ac=1;
            bc=5;
            dc=12;
            get();
        };
        Myclass(int a, int b, int c){
            ac=a;
            bc=b;
            dc=c;
            get();
        };
        Myclass(const Myclass &myclass):
            ac(myclass.ac), bc(myclass.bc), dc(myclass.dc){
                cout<<"Copy constructor worked in Myclass!\n";
                get();
            };
        ~Myclass(){
            cout<<"Destructor worked in class Myclass!\n";
        };
    private:
        int ac;
        int bc; 
        int dc;
    void get(){
        cout << "A = " << ac << "\n" << "B = " << bc <<"\n"<<"C = "<< dc << endl;
    };
};
class Test{
    public:
        Test(){
            name="First";
            mas=1;
            get();
        };
        Test(string a, double b){
            name=a;
            mas=b;
            get();
        };
        Test(const Test &test):
            name(test.name), mas(test.mas){
                cout<<"Copy constructor worked in class Test!\n";
                get();
            };
        ~Test(){
            cout<<"Destructor worked in class Test!\n";
        };
    private:
        string name;
        double mas; 
    void get(){
        cout << "Name = " << name << "\n" << "Mas = " << mas << endl;
    };
};
int main() {
    Myclass test1;
    Myclass test2(12,13,16);
    Myclass copytest2(test2);
    Test *first = new Test();
    Test *second = new Test("dadad", 12);
    Test copyfirst(*second);
    return 0;
}

Создаю два класса и в каждом из них создаю по 3 конструктора и по 1 деструктору, не могу понять почему выводится в первом классе три раза: "Destructor worked in class Myclass! Destructor worked in class Myclass! Destructor worked in class Myclass!", а во втором классе только один раз: "Destructor worked in class Test!".


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

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

Дело в том, что вы создали 3 объекта MyClass с автоматическим временем жизни, грубо — на стеке, и по выходе из функции все три уничтожаются:

Myclass test1;
Myclass test2(12,13,16);
Myclass copytest2(test2);

Но с классом Test ситуация иная: такой объект только один — copyfish, он и уничтожается автоматически. Остальные два объекта динамические, за их уничтожение отвечаете вы сами. При выходе из функции они остаются жить.

Test *first = new Test();
Test *second = new Test("dadad", 12);
Test copyfirst(*second);

Вот если вы добавите их уничтожение руками

delete second;
delete first;

то увидите и здесь три вывода из деструкторов.

→ Ссылка