class - c++ destructor called before end of program -


when run following code in vs2013:

#include <iostream> #include <vector> #include <string> using namespace std;  class auteur { public:     auteur(string n, bool p = false)     : nom(n), prime(p)     {}     const string getnom(){         return nom;     }     bool getprix(){     return prime;     }    //auteur(const auteur&) = delete;  private:    string nom;    bool prime;    }; class oeuvre{ public:     oeuvre(string t, auteur &a, string lang)     : titre(t), langue(lang), auteur(a)     {}      tring gettitre(){     return titre;      } const auteur & getauteur(){     return auteur;      }     string getlangue(){     return langue;      }     void affiche(){     cout << titre << " ," << auteur.getnom() << " en " << getlangue() << endl;     }     ~oeuvre(){     cout << "l'oeuvre " <<titre << ", " << auteur.getnom() << ", en " << langue     << " n'est plus disponible." << endl;    }    //oeuvre(const oeuvre&) = delete;  private:     string titre;     auteur &auteur; string langue; };  class exemplaire{ public: exemplaire(oeuvre & oeuvre)     : oeuvre(oeuvre) {     auteur = oeuvre.getauteur();     cout << "nouvel exemplaire de : " << oeuvre.gettitre() << ", " << a.getnom() <<" en " << oeuvre.getlangue() << endl; } exemplaire(exemplaire const& ex)     : oeuvre(ex.oeuvre) {     auteur = oeuvre.getauteur();     cout << "copie d'un exemplaire de : " << oeuvre.gettitre() << ", " << a.getnom() << ", en " << oeuvre.getlangue() << endl; } const oeuvre & getoeuvre() const{     return oeuvre; } void affiche(){     auteur = oeuvre.getauteur();     cout << "exemplaire de : " << oeuvre.gettitre() << ", " << a.getnom() << ", en " << oeuvre.getlangue() << endl; } ~exemplaire(){     auteur = oeuvre.getauteur();     cout << "un exemplaire de " << oeuvre.gettitre() << ", " << a.getnom() << ", en " << oeuvre.getlangue() << " été jeté !" << endl;  }  private: oeuvre  &oeuvre; }; class bibliotheque{ public: bibliotheque(string nom)     : nom(nom) {     cout << "la bibliothèque " << nom << " est ouverte !" << endl; } string getnom(){     return nom; } void stocker(oeuvre &oeuvre, int n = 1) {     (int = 0; < n; i++){         exp.push_back(new exemplaire(oeuvre));     } } void lister_exemplaires(string langue = ""){     int taille = exp.size();     if (langue.empty() == true)     {         (auto & ex : exp) {             (*ex).affiche();         }      }     else {         (int i(0); i<taille; i++)         {             oeuvre o = exp[i]->getoeuvre();             if (o.getlangue() == langue){                 exp[i]->affiche();             }         }     } } int compter_exemplaires(oeuvre ev){     int ct = 0;     (auto &ex : exp) {         oeuvre ew = (*ex).getoeuvre();         auteur @ = ew.getauteur();         auteur = ev.getauteur();         if (ew.gettitre() == ev.gettitre() && at.getnom() == a.getnom() && ew.getlangue() == ev.getlangue())             ct++;     }     return ct; } void afficher_auteurs(bool b= false){     (auto & ex : exp)     {         oeuvre ev = (*ex).getoeuvre();         auteur auteur = ev.getauteur();         string s = auteur.getnom();         if (b){             if (auteur.getprix())             cout << s << endl;         }      }  } ~bibliotheque(){     cout << "la bibliothèque " << getnom() << " ferme ses portes, \net détruit ses exemplaire :" << endl;     int taille = exp.size();     (int i(0); i<taille; i++)         delete exp[i]; }   private: string nom; vector <exemplaire *> exp;  };   int main() { auteur a1("victor hugo"),     a2("alexandre dumas"),     a3("raymond queneau", true);  oeuvre o1("les misérables", a1, "français"),     o2("l'homme qui rit", a1, "français"),     o3("le comte de monte-cristo", a2, "français"),     o4("zazie dans le métro", a3, "français"),     o5("the count of monte-cristo", a2, "anglais");  bibliotheque biblio("municipale"); biblio.stocker(o1, 2); biblio.stocker(o2); biblio.stocker(o3, 3); biblio.stocker(o4); biblio.stocker(o5);  cout << "la bibliothèque " << biblio.getnom()     << " offre les exemplaires suivants :" << endl; biblio.lister_exemplaires();  const string langue("anglais"); cout << " les exemplaires en " << langue << " sont :" << endl; biblio.lister_exemplaires(langue);  cout << " les auteurs à succès sont :" << endl; biblio.afficher_auteurs(true);  cout << " il y " << biblio.compter_exemplaires(o3) << " exemplaires de "     << o3.gettitre() << endl;  return 0; } 

i following output:

la bibliothÞque municipale est ouverte ! nouvel exemplaire de : les misÚrables, victor hugo en franþais nouvel exemplaire de : les misÚrables, victor hugo en franþais nouvel exemplaire de : l'homme qui rit, victor hugo en franþais nouvel exemplaire de : le comte de monte-cristo, alexandre dumas en franþais nouvel exemplaire de : le comte de monte-cristo, alexandre dumas en franþais nouvel exemplaire de : le comte de monte-cristo, alexandre dumas en franþais nouvel exemplaire de : zazie dans le mÚtro, raymond queneau en franþais nouvel exemplaire de : count of monte-cristo, alexandre dumas en anglais la bibliothÞque municipale offre les exemplaires suivants : exemplaire de : les misÚrables, victor hugo, en franþais exemplaire de : les misÚrables, victor hugo, en franþais exemplaire de : l'homme qui rit, victor hugo, en franþais exemplaire de : le comte de monte-cristo, alexandre dumas, en franþais exemplaire de : le comte de monte-cristo, alexandre dumas, en franþais exemplaire de : le comte de monte-cristo, alexandre dumas, en franþais exemplaire de : zazie dans le mÚtro, raymond queneau, en franþais exemplaire de : count of monte-cristo, alexandre dumas, en anglais  les exemplaires en anglais sont : l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre l'homme qui rit, victor hugo, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre zazie dans le mÚtro, raymond queneau, en franþais n'est plus disponible. exemplaire de : count of monte-cristo, alexandre dumas, en anglais l'oeuvre count of monte-cristo, alexandre dumas, en anglais n'est plus disponible.  les auteurs Ó succÞs sont : l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre l'homme qui rit, victor hugo, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. raymond queneau l'oeuvre zazie dans le mÚtro, raymond queneau, en franþais n'est plus disponible. l'oeuvre count of monte-cristo, alexandre dumas, en anglais n'est plus disponible. l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. l'oeuvre l'homme qui rit, victor hugo, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre zazie dans le mÚtro, raymond queneau, en franþais n'est plus disponible. l'oeuvre count of monte-cristo, alexandre dumas, en anglais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible.  il y 3 exemplaires de le comte de monte-cristo la bibliothÞque municipale ferme ses portes, et dÚtruit ses exemplaire : un exemplaire de les misÚrables, victor hugo, en franþais ÚtÚ jetÚ ! un exemplaire de les misÚrables, victor hugo, en franþais ÚtÚ jetÚ ! un exemplaire de l'homme qui rit, victor hugo, en franþais ÚtÚ jetÚ ! un exemplaire de le comte de monte-cristo, alexandre dumas, en franþais ÚtÚ jetÚ ! un exemplaire de le comte de monte-cristo, alexandre dumas, en franþais ÚtÚ jetÚ ! un exemplaire de le comte de monte-cristo, alexandre dumas, en franþais ÚtÚ jetÚ ! un exemplaire de zazie dans le mÚtro, raymond queneau, en franþais ÚtÚ jetÚ ! un exemplaire de count of monte-cristo, alexandre dumas, en anglais ÚtÚ jetÚ ! l'oeuvre count of monte-cristo, alexandre dumas, en anglais n'est plus disponible. l'oeuvre zazie dans le mÚtro, raymond queneau, en franþais n'est plus disponible. l'oeuvre le comte de monte-cristo, alexandre dumas, en franþais n'est plus disponible. l'oeuvre l'homme qui rit, victor hugo, en franþais n'est plus disponible. l'oeuvre les misÚrables, victor hugo, en franþais n'est plus disponible. 

where instead should following output:

la bibliothèque municipale est ouverte ! nouvel exemplaire de : les misérables, victor hugo, en français nouvel exemplaire de : les misérables, victor hugo, en français nouvel exemplaire de : l'homme qui rit, victor hugo, en français nouvel exemplaire de : le comte de monte-cristo, alexandre dumas, en français nouvel exemplaire de : le comte de monte-cristo, alexandre dumas, en français nouvel exemplaire de : le comte de monte-cristo, alexandre dumas, en français nouvel exemplaire de : zazie dans le métro, raymond queneau, en français nouvel exemplaire de : count of monte-cristo, alexandre dumas, en anglais la bibliothèque municipale offre les exemplaires suivants : exemplaire de : les misérables, victor hugo, en français exemplaire de : les misérables, victor hugo, en français exemplaire de : l'homme qui rit, victor hugo, en français exemplaire de : le comte de monte-cristo, alexandre dumas, en français exemplaire de : le comte de monte-cristo, alexandre dumas, en français exemplaire de : le comte de monte-cristo, alexandre dumas, en français exemplaire de : zazie dans le métro, raymond queneau, en français exemplaire de : count of monte-cristo, alexandre dumas, en anglais  les exemplaires en anglais sont : exemplaire de : count of monte-cristo, alexandre dumas, en anglais  les auteurs à succès sont : raymond queneau  il y 3 exemplaires de le comte de monte-cristo la bibliothèque municipale ferme ses portes, et détruit ses exemplaires :  un exemplaire de "les misérables, victor hugo, en français" été jeté ! un exemplaire de "les misérables, victor hugo, en français" été jeté ! un exemplaire de "l'homme qui rit, victor hugo, en français" été jeté ! un exemplaire de "le comte de monte-cristo, alexandre dumas, en français" été jeté ! un exemplaire de "le comte de monte-cristo, alexandre dumas, en français" été jeté ! un exemplaire de "le comte de monte-cristo, alexandre dumas, en français" été jeté ! un exemplaire de "zazie dans le métro, raymond queneau, en français" été jeté ! un exemplaire de "the count of monte-cristo, alexandre dumas, en anglais" été jeté ! l'oeuvre "the count of monte-cristo, alexandre dumas, en anglais" n'est plus disponible. l'oeuvre "zazie dans le métro, raymond queneau, en français" n'est plus disponible. l'oeuvre "le comte de monte-cristo, alexandre dumas, en français" n'est plus disponible. l'oeuvre "l'homme qui rit, victor hugo, en français" n'est plus disponible. l'oeuvre "les misérables, victor hugo, en français" n'est plus disponible. 

can please tell me problem. why oeuvre class destructor called before end of main program ?

inside loops in 'afficher_auteurs', 'compter_exemplaires', etc, making copies of objects, this;

 oeuvre ev = (*ex).getoeuvre(); 

so while getoeuvre returning object reference, receiver variable 'ev' not receiving reference, , hence copy made. destructor of these copied objects called on exit of loop (when goes out of scope) -- likely reason seeing destructor running before 'main' completing.

try fix change code receive reference , see if works, this;

oeuvre& ev = (*ex).getoeuvre();

or

const oeuvre& ev = (*ex).getoeuvre();

and while @ it, want declare methods on oeuvre 'const', like

const auteur & getauteur() const {....

as otherwise not able use methods on const object.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -