C++ : problème de mémoire

sisier

Grand Maître
Bonjour tout le monde,

Je fais des petits exos pour me remettre dans le bain du c++.
Et la, je sèche un peu.
J'ai un problème à la libération de la mémoire et je ne vois pas trop pourquoi.


[cpp]adherent.h

class adherent
{
char * nom;
char * prenom;
char * adresse;
int age;
//static int iden;
exemplaire * emprunt[3];
public:
adherent(char *,char *, char *, int);
adherent(const adherent &);
~adherent();
int emprunter(exemplaire &);
int restituer(exemplaire &);




};[/cpp]

[cpp]adherent.cpp

adherent::adherent(char * name, char * prename, char * adr, int old)
{
//id = 0;
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;



for(i=0;i<3;i++)
{
emprunt = 0;
}

//iden++;


}

// 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=a.nom;

}

longueur = strlen(a.prenom)+1;
prenom = new char[longueur];
for(i=0;i<longueur;i++)
{
prenom=a.prenom;

}

longueur = strlen(a.adresse)+1;
adresse = new char[longueur];
for(i=0;i<longueur;i++)
{
adresse=a.adresse;

}

age= a.age;

for(i=0;i<3;i++)
{
emprunt = a.emprunt;
}


}

....


adherent::~adherent()
{
int i;
//delete [] nom;
delete [] prenom;
delete [] adresse;
for(i=0;i<3;i++)
{
delete [] emprunt;
}

delete [] emprunt;



}[/cpp]


[cpp]int main()
{
cout<<"toto";
adherent oliv("toto","olivier","5 rue de la marée",26);
adherent vincent("lulu","vincent","5 rue de la poutre",28);







return 0;
}[/cpp]


J'ai un problème avec la ligne :
//delete [] nom;
dans adherent.cpp

Mon programme retourne un code d'erreur à la fin de l'éxécution (-17.... ) :
- Si je la décommente et que je laisse le programme tel quel,

Par contre, si je commente la ligne : adherent vincent("lulu","vincent","5 rue de la poutre",28);
L'erreur n'apparait plus.
Donc, je ne peux faire qu'une instance si je veux pas crée d'erreur.


AZvez vous une petite idée?

Merci pour votre aide :)
 

KangOl

Grand Maître
on est en c++, alors utilise std::string
ca evitera beaucoup de problèmes :o
 

sisier

Grand Maître


Oui, j'utiliserais cela à l'avenir. :)

Sinon dans mon code, il y a rien qui te choque? (parce que j'ai quand même du faire une erreur pour avoir ce problème).
 

KangOl

Grand Maître
1/ le constructeur doit prendre des const char * (ou mieux, des const std::string &)
2/ le meme constructeur doit creer des char[] et pas des char()
3/ pourquoi tu utilises pas strcpy dans le constructeur de copie ? au fait non, faut utiliser std::string.
4/ a/ pour bien faire, tu devrais pas avoir des pointeur vers des exemplaires (emprunts) mais des const &
b/ tu es pas propriétaire de ces pointeurs, donc tu dois pas les supprimer dans ton destructeur (et encore moins avec un delete[])
 

sisier

Grand Maître




1) Oui, c'est fait ... j'oublie toujours de le spécifier :whistle:
2) Merci , c'etait la l'erreur : pourtant dans le constructeur par recopie,je l'avias bien fait :pt1cable:
3) Oui, sur l'exo d'avant je travaillais sur des tableaux de chiffres,j'ai repris le constructeur par recopie, j'ai pas fait attention :whistle:

4)
a) Utiliser des références à la place de mon pointeur, c'est ça que tu veux dire?
b) Tu parles pour emprunt? ou pour tous ?

Merci pour ton aide, en tout cas :)
Ca me dépanne vraiment
 

KangOl

Grand Maître
4b/ pour emprunt, c'est l'objet qui fait les new qui doit faire les delete
 

KangOl

Grand Maître
de plus, tu devrais vérifier qu'on te passe des pointeurs non null :o ( a l'aide d'exception stp)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 836
Membres
1 586 369
Dernier membre
Mouslah
Partager cette page
Haut