Problème libération mémoire [Résolu]

Signaler
Messages postés
6
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 février 2008
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Bonjour tout le monde,

Je fais des petits exos pour mettre à niveau et je bloque un peu la.
Lors de la libération de la mémoire dans le destructeur, le programme me renvoit un code erreur.

Si vous avez une idée.

Voila la classe :

class adherent
{
      char * nom;
      char * prenom;
      char * adresse;
       int age;
  public:
       adherent(char *,char *, char *, int);
       adherent(const adherent &);
      ~adherent();
 
 
};

Voici mes constructeurs et destructeurs :

adherent::adherent(char * name, char * prename, char * adr, int old)
{
      int longueur,i;
      longueur = strlen(name)+1;
      nom = new char(longueur);
      strcpy(nom,name);
 
       longueur = strlen(prename)+1;
       prenom = new char(longueur);
      strcpy(prenom,prename);
 
       longueur = strlen(adr)+1;
       adresse = new char(longueur);
       strcpy(adresse,adr);
 
        age=old;
   
 
}

// constructeur par recopie
adherent::adherent(const adherent & a)
{
      int i,longueur;
 
      longueur = strlen(a.nom)+1;
      nom = new char[longueur];
      for(i=0;i<longueur;i++)
     {
           nom[i]=a.nom[i];
  
      }
 
       longueur = strlen(a.prenom)+1;
       prenom = new char[longueur];
       for(i=0;i<longueur;i++)
      {
          prenom[i]=a.prenom[i];
   
        }
 
        longueur = strlen(a.adresse)+1;
       adresse = new char[longueur];
       for(i=0;i<longueur;i++)
      {
           adresse[i]=a.adresse[i];
  
       }
 
        age= a.age;
 
 
 
}

adherent::~adherent()
{
       //      delete [] nom; retourne un code erreur lorsque j'instancie 2 adherents
      delete [] prenom;
      delete [] adresse;
  
}

Voici le main :

int main()
{
         adherent oliv("loks","olivier","1 rue de l'église",26);
        adherent vincent("lutun","vincent","5 rue de l'église",26);

 
         return 0;
}

Vous voyez une erreur?
PS : la prochaine j'utiliserais std::string mais j'aimerais comprendre mon erreur aussi :)

Merci, pour votre aide

9 réponses

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
nom = new char(longueur);

Ce sont des crochets [] qu'il faut pour allouer la mémoire.



C++ (@++)<!--
Messages postés
6
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 février 2008

J'ai trouvé :

J'ai modifié cela :
 nom = new char(longueur);


par 

 nom = new char[longueur];

y a des jours comme ça
Messages postés
6
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 février 2008

Merci :)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Pourquoi ces boucles de recopie dans le constructeur de copie et non des strcpy() tout simplement ???

Ex: strcpy(nom,a.nom);

D'autant plus que le zero binaire terminateur n'est pas recopié et que ces chaînes sont donc inutilisables !

Jean-François
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
Ça revient exactement au même et oui le 0 de fin de chaine est recopié.

C++ (@++)<!--
Messages postés
6
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 février 2008

Oui oui, tu as raison, c'est corrigé (j'avais betêment recopié un constructeur par recopie).

Mais le caractère était recopié d'où le +1 ;)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Effectivement, lecture rapide et je n'ais pas remarqué le +1.
Du coup, on a ici une erreur d'un autre genre (l'un des pires qui soit) : la variable mal nommée !

Ne pas confondre la longueur et la taille d'une chaîne de caractères.
Longueur = nombre de caractères = strlen().
Taille = place occupée = longueur + terminateur = strlen() + 1.

Jean-François
Messages postés
6
Date d'inscription
vendredi 6 avril 2007
Statut
Membre
Dernière intervention
4 février 2008

oui, tu as pas tort  .. le terme est mal choisi :)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
14
Et encore, un caractère ne fait pas nécessairement un octet (UNICODE).
La variable est mal nommé ici en effet mais ça fait voir aussi autre chose: faut pas se fier non plus uniquement sur les noms de variable. Le contexte compte pour beaucoup (plus).

C++ (@++)<!--