Se connecter avec
S'enregistrer | Connectez-vous

C++ : problème de mémoire

Dernière réponse : dans Programmation

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.


  1. adherent.h
  2.  
  3. class adherent
  4. {
  5. char * nom;
  6. char * prenom;
  7. char * adresse;
  8. int age;
  9. //static int iden;
  10. exemplaire * emprunt[3];
  11. public:
  12. adherent(char *,char *, char *, int);
  13. adherent(const adherent &);
  14. ~adherent();
  15. int emprunter(exemplaire &);
  16. int restituer(exemplaire &);
  17.  
  18.  
  19.  
  20.  
  21. };


  1. adherent.cpp
  2.  
  3. adherent::adherent(char * name, char * prename, char * adr, int old)
  4. {
  5. //id = 0;
  6. int longueur,i;
  7. longueur = strlen(name)+1;
  8. nom = new char(longueur);
  9. strcpy(nom,name);
  10.  
  11. longueur = strlen(prename)+1;
  12. prenom = new char(longueur);
  13. strcpy(prenom,prename);
  14.  
  15. longueur = strlen(adr)+1;
  16. adresse = new char(longueur);
  17. strcpy(adresse,adr);
  18.  
  19. age=old;
  20.  
  21.  
  22.  
  23. for(i=0;i<3;i++)
  24. {
  25. emprunt[i] = 0;
  26. }
  27.  
  28. //iden++;
  29.  
  30.  
  31. }
  32.  
  33. // constructeur par recopie
  34. adherent::adherent(const adherent & a)
  35. {
  36. int i,longueur;
  37.  
  38. longueur = strlen(a.nom)+1;
  39. nom = new char[longueur];
  40. for(i=0;i<longueur;i++)
  41. {
  42. nom[i]=a.nom[i];
  43.  
  44. }
  45.  
  46. longueur = strlen(a.prenom)+1;
  47. prenom = new char[longueur];
  48. for(i=0;i<longueur;i++)
  49. {
  50. prenom[i]=a.prenom[i];
  51.  
  52. }
  53.  
  54. longueur = strlen(a.adresse)+1;
  55. adresse = new char[longueur];
  56. for(i=0;i<longueur;i++)
  57. {
  58. adresse[i]=a.adresse[i];
  59.  
  60. }
  61.  
  62. age= a.age;
  63.  
  64. for(i=0;i<3;i++)
  65. {
  66. emprunt[i] = a.emprunt[i];
  67. }
  68.  
  69.  
  70. }
  71.  
  72. ....
  73.  
  74.  
  75. adherent::~adherent()
  76. {
  77. int i;
  78. //delete [] nom;
  79. delete [] prenom;
  80. delete [] adresse;
  81. for(i=0;i<3;i++)
  82. {
  83. delete [] emprunt[i];
  84. }
  85.  
  86. delete [] emprunt;
  87.  
  88.  
  89.  
  90. }



  1. int main()
  2. {
  3. cout<<"toto";
  4. adherent oliv("toto","olivier","5 rue de la marée",26);
  5. adherent vincent("lulu","vincent","5 rue de la poutre",28);
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13. return 0;
  14. }



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 :) 

Autres pages sur : probleme memoire

Lassé par la pub ? Créez un compte

KangOl a dit :
on est en c++, alors utilise std::string
ca evitera beaucoup de problèmes :o 


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).

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[])

KangOl a dit :
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[])




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
Lassé par la pub ? Créez un compte