Reference member: wieso ruft Konstruktor Destruktor auf?



  • Hallo,
    ich habe folgendes Programm:

    #include <iostream>
    #include <cstring>
    
    class Data
    {
        private:
            char* filename;
            unsigned int m_data_length;
    
        public:
            Data(char*);
            virtual ~Data();
    };
    
    Data::Data(char* fn)
    {
        std::cout << "Data construktor\n";
        filename = new char[strlen(fn) + 1];
        strcpy(filename, fn);
        filename[strlen(fn)] = '\0';
    }
    
    Data::~Data()
    {
        std::cout << "Data destructor\n";
    }
    
    class Agent
    {
        private:
            Data& input;
            Data& output;
    
        public:
            Agent(Data i, Data o);
            ~Agent();
    };
    
    Agent::Agent(Data i, Data o): input(i), output(o)
    {
        std::cout << "Agent Konstruktor\n";
    }
    
    Agent::~Agent()
    {
        std::cout << "Agent Destruktor\n";
    }
    
    int main()
    {
        std::cout << __LINE__ << std::endl;
        Data* d1 = new Data("test1");
    
        std::cout << __LINE__ << std::endl;
        Data* d2 = new Data("test2");
    
        std::cout << __LINE__ << std::endl;
    
        Agent* f = new Agent(*d1, *d2);
    
        std::cout << __LINE__ << std::endl;
    
        delete f;
        std::cout << __LINE__ << std::endl;
        delete d2;
        std::cout << __LINE__ << std::endl;
        delete d1;
        std::cout << __LINE__ << std::endl;
        return 0;
    }
    

    Ich moechte gerne verstehen, wieso am Ende des Agent Konstruktors die Destruktoren von d1 und d2 aufgerufen werden, und ob ich da voelligen Bloedsinn veranstalte. Wie geht man dann richtig mit reference members um, wenn es eben Referenzen und keine Zeiger sein sollen?



  • weil du an den konstruktor von Agent kopien von Data uebergibts (Agent(Data i, Data o) )
    diese werden nach dem konstruktoraufruf natuerlich wieder zerstoert.
    mach halt zeiger oder referenzen draus.

    Agent(Data* i, Data* o) //oder
    Agent(Data& i, Data& o)
    
    Agent* f = new Agent(*d1, *d2);//referenzen
    Agent* f = new Agent(d1, d2);  //zeiger
    

Anmelden zum Antworten