Konstruktor~Destruktor



  • Hallo liebe C++ Experten,
    Ich habe hier ein einfaches c++ Programm:

    #include<iostream>
    using namespace std;
    
    class test{
    private:
    int abc;
    public:
    test(int i=9);    //Konstruktor
    ~test();          //Destruktor
    int ausgabe() {return abc;}
    };
    test::test(int i) {    //Konstruktor
    cout<<"Konstruktor\n";
    if (i>12)
    abc=i;
    else
    abc=i;
    }
    
    test::~test(){        //Destruktor
    cout<<"Destruktor\n";
    };
    
    int main() {
    test x(7);
    test y;
    test z(13);
    cout<<" "<<x.ausgabe()<<"\n";
    cout<<" "<<y.ausgabe()<<"\n";
    cout<<" "<<z.ausgabe()<<"\n";
    
    return 0;
    }
    

    :
    unter Linux kommt einwandfrei:

    Konstruktor
    Konstruktor
    Konstruktor
     7
     9
     13
    Destruktor
    Destruktor
    Destruktor
    

    unter Windows bekomme Ich bei demselben Programm unter Dev++ leider nur:

    Konstruktor
    Konstruktor
    Konstruktor
     7
     9
     13
    

    ???

    Warum fehlt der Destruktordurchlauf, hat jemand eine Idee ?



  • Fehlt der Aufruf oder nur die Ausgabe?
    - versuche es mit cerr statt cout
    - benutze einen Debugger



  • vs 2013 (v120), ctp nov 2013, icc xe 14:

    Konstruktor
    Konstruktor
    Konstruktor
     7
     9
     13
    Destruktor
    Destruktor
    Destruktor
    

    ...



  • wenn Ich in Zeile 21 cerr statt cout eingebe geht es auch nicht ..? Aber es kommen keine Fehlermeldungen, deshalb glaube Ich, dass der Aufruf funktioniert ?



  • Hi versuch es mal mit

    #include<iostream> 
    using namespace std; 
    
    class test{ 
    private: 
    int abc; 
    public: 
    test(int i=9);    //Konstruktor 
    ~test();          //Destruktor 
    int ausgabe() {return abc;} 
    }; 
    test::test(int i) {    //Konstruktor 
    cout<<"Konstruktor\n"; 
    if (i>12) 
    abc=i; 
    else 
    abc=i; 
    } 
    
    test::~test(){        //Destruktor 
    cout<<"Destruktor\n"; 
    };
    
    void testfunc()
    {
     test x(7); 
     test y; 
     test z(13); 
     cout<<" "<<x.ausgabe()<<"\n"; 
     cout<<" "<<y.ausgabe()<<"\n"; 
     cout<<" "<<z.ausgabe()<<"\n";
    }
    
    int main() { 
     testfunc();
    
    return 0; 
    }
    

    ich glaube die Ausgabe wird nicht mehr richtig über cout und cerr ausgegeben nach dem Programmende. Vieleicht muss man sie auch einfach nur flushen oder so?

    Gruß, Daniel_S



  • jetzt geht es auch in cpp super! danke!



  • Daniel_S schrieb:

    ich glaube die Ausgabe wird nicht mehr richtig über cout und cerr ausgegeben nach dem Programmende.

    Nene:

    ISO/IEC 14882:2011 (N3777) schrieb:

    § 3.7.3.3
    If a variable with automatic storage duration has initialization or a destructor with side effects, it shall not be destroyed before the end of its block, nor shall it be eliminated as an optimization even if it appears to be unused, except that a class object or its copy/move may be eliminated as specified in 12.8.

    //edith: Darf doch nicht sein, oder?


  • Mod

    ISO/IEC 14882:2011 (N3777)

    N3337 reicht.

    Darf doch nicht sein, oder?

    Was genau darf nicht sein? Das Zitat ist selbstverständlich. Vergiss aber nicht as-if. Solange keine beobachtbaren Seiteneffekte verändert werden kann die Implementierung optimieren wie sie lustig ist.



  • Wie waere es, wenn du deinen Code erstmal formatierst. Kann (/will) ja niemand lesen so.



  • Hier hat jemand das selbe Problem http://stackoverflow.com/questions/6494278/destructor-does-not-work

    Hast du dein Programm (die erste Version) mal aus der Konsole gestartet wie im Link beschrieben, oder nur so per Doppelklick?



  • Arcoth schrieb:

    ISO/IEC 14882:2011 (N3777)

    N3337 reicht.

    Sag mir bitte nicht, was ich schreiben darf und was nicht ...

    Arcoth schrieb:

    Darf doch nicht sein, oder?

    Was genau darf nicht sein? [...] Vergiss aber nicht as-if. [...]

    Das, was der TO beschreibt. Das ist nicht as-if. Aber wahrscheinlich hat er einfach nur die Testumstände ungenau beschrieben.



  • Arcoth schrieb:

    ISO/IEC 14882:2011 (N3777)

    N3337 reicht.

    Aber mit der Lang-Version kann ein Einsteiger doch echt besser selber danach googeln. Sehr fein von Swordfish, die manchmal auch zu nennen. 👍



  • volkard schrieb:

    Arcoth schrieb:

    ISO/IEC 14882:2011 (N3777)

    N3337 reicht.

    Aber mit der Lang-Version kann ein Einsteiger doch echt besser selber danach googeln.

    N3337 reicht 😉

    Swordfish schrieb:

    Arcoth schrieb:

    ISO/IEC 14882:2011 (N3777)

    N3337 reicht.

    Sag mir bitte nicht, was ich schreiben darf und was nicht ...

    Er hat doch nur geschrieben dass N3337 reicht. Ist doch kein "Verbot" es auszuschreiben.


  • Mod

    Das, was der TO beschreibt.

    Achso, ich dachte du meinst das Zitat. 🙂


Anmelden zum Antworten