Problème libération mémoire

Résolu
beeeeh Messages postés 6 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 février 2008 - 3 févr. 2008 à 16:08
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 4 févr. 2008 à 15:58
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

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
3 févr. 2008 à 16:36
nom = new char(longueur);

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



C++ (@++)<!--
3
beeeeh Messages postés 6 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 février 2008
3 févr. 2008 à 16:37
J'ai trouvé :

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


par 

 nom = new char[longueur];

y a des jours comme ça
0
beeeeh Messages postés 6 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 février 2008
3 févr. 2008 à 16:56
Merci :)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
4 févr. 2008 à 01:56
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 févr. 2008 à 02:07
Ça revient exactement au même et oui le 0 de fin de chaine est recopié.

C++ (@++)<!--
0
beeeeh Messages postés 6 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 février 2008
4 févr. 2008 à 09:16
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 ;)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
4 févr. 2008 à 10:52
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
0
beeeeh Messages postés 6 Date d'inscription vendredi 6 avril 2007 Statut Membre Dernière intervention 4 février 2008
4 févr. 2008 à 11:00
oui, tu as pas tort  .. le terme est mal choisi :)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 févr. 2008 à 15:58
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++ (@++)<!--
0
Rejoignez-nous