begin process at 2012 05 29 21:12:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Autre

 > 

Problème libération mémoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème libération mémoire

dimanche 3 février 2008 à 16:08:41 | Problème libération mémoire

beeeeh

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


dimanche 3 février 2008 à 16:36:44 | Re : Problème libération mémoire

SAKingdom

Membre Club
Réponse acceptée !
nom = new char(longueur);


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

C++ (@++)

dimanche 3 février 2008 à 16:37:59 | Re : Problème libération mémoire

beeeeh

J'ai trouvé :

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

par 

 nom = new char[longueur];



y a des jours comme ça




dimanche 3 février 2008 à 16:56:47 | Re : Problème libération mémoire

beeeeh

Merci :)
lundi 4 février 2008 à 01:56:27 | Re : Problème libération mémoire

jfrancois

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

lundi 4 février 2008 à 02:07:43 | Re : Problème libération mémoire

SAKingdom

Membre Club
Ça revient exactement au même et oui le 0 de fin de chaine est recopié.

C++ (@++)

lundi 4 février 2008 à 09:16:58 | Re : Problème libération mémoire

beeeeh

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 ;)
lundi 4 février 2008 à 10:52:49 | Re : Problème libération mémoire

jfrancois

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

lundi 4 février 2008 à 11:00:39 | Re : Problème libération mémoire

beeeeh

oui, tu as pas tort  .. le terme est mal choisi :)
lundi 4 février 2008 à 15:58:00 | Re : Problème libération mémoire

SAKingdom

Membre Club
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++ (@++)



Cette discussion est classée dans : adresse, char, prenom, longueur, adherent


Répondre à ce message

Sujets en rapport avec ce message

regardez ma source HELP [ par asnow ] BonjourJe debute en C. j'ai voulu apprendre à enregistrer des données dans un fichier, ca a donné ce code .Si vous pouviez me donner des recommandatio reservation de la memoire [ par khalid_trunks ] salut ts le monde.je debute en c++,j'ai fais une petite simple application( gestion d'appelles)....je sais po grand chose en c++.ben j'ai fais mon pro ajouter la longueur de la chaine à unsigned char * [ par DoudouBidou ] Bonjour, j'ai encore un problème avec une variable unsigned char * ma variable contient au maximum 255 caractere et je dois ajouter la longueur reel FTP et fichiers [ par cobra176 ] j'ai créer un programme qui recherche des mots clée et affiche les lignes qui les contint dans des fichiers log qui eux sont contenu dans un serveur f [C] Passage de tableau par adresse (réference) [ par nitrique ] Bonjour,Je sais que la question a été posée sous des angles différents mais rien n'y fait.J'aimerais passer mon tableau de char à ma fonction par adre Conversion d'adresse en char ? [ par supergrey ] Bonjour, voila mon probleme:Dans mon programme j'ai un tableau: VOID* szTemp[256]qui contient des trucs du genre: 0xcccccc59 0xcc ouvrir un fichier avec devcpp [ par anek971 ] lut tout le monde,Bon j'ai fait un petit programme tout bete juste pour pouvoir ecrire une donné sur une personne ,dans le but d'agrementer ca plustar probleme de comparaison de membre de structure par rapport a une donnée de fichier [ par Yossi ] bonjour struct adherents{ int numadherent; char nom[25]; char prenom[30]; char adresse[80]; char cp[5]; char ville[40]; };j'ai un probleme (surement u problème d'execution!!! [ par theidiot ] Bonjours,je suis débutant en programmation et je suis présentement dans l'apprentissage des tableaux dynamiques.J'ai fait un carnet d'adresse(avec les Longueur de chaine (classique newbie) [ par atlas189 ] Bonjour , je débute en c++Pourriez-vous corriger mon code .Le principe est de renvoyé la longueur d'une chaine tapée au clavier .MerciBon c'est archi-


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,186 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales