IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de réallocation de la mémoire


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut Problème de réallocation de la mémoire
    Salut voila je suis entrain de bosser sur une petite application et je veut réallouer de la mémoire et ajouter un element avec la fonction new mais le problème c’est que chaque fois je réalloue la mémoire de mon objet tous les données disparaisses
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	Rendezvous *t;
    	int n;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    agenda::operator +(Rendezvous &s){
    this->t=new Rendezvous[this->n+1];
    this->t[this->n].p.anne=s.p.anne;
    this->t[this->n].p.jour=s.p.jour;
    this->t[this->n].p.mois=s.p.mois;
    this->t[this->n].s.copy(s.s);
    this->n++;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Conseil : Pour avoir des conteneur de taille variable, utilise la STL. Je ne sais pas quel est le type de t, mais il gagnerait probablement à être un vector<Rendezvous>, ou une list<Rendezvous>, selon les opérations que tu veux lui faire.

    En interne, ces conteneurs réalisent quand nécessaire la copie qui est le seul moyen de garder les données initiales lors d'une réallocation.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Conseil : Pour avoir des conteneur de taille variable, utilise la STL. Je ne sais pas quel est le type de t, mais il gagnerait probablement à être un vector<Rendezvous>, ou une list<Rendezvous>, selon les opérations que tu veux lui faire.

    En interne, ces conteneurs réalisent quand nécessaire la copie qui est le seul moyen de garder les données initiales lors d'une réallocation.
    T c’est un tableau dynamique d’objet


    Je peux pas travailler avec stl ou vecteur car je suis suivi par un cahier de charge qui m’oblige a ne rien ajouter

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il faut recopier tes données à la main.
    Et il faut aussi libérer les anciennes données.
    Boost ftw

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Il faut recopier tes données à la main.
    Et il faut aussi libérer les anciennes données.
    je viens de le faire mais ca beug :beug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    agenda::operator +(Rendezvous &rv){
     
    	int i=0;
    	Rendezvous *T=new Rendezvous[this->n+1];
    	for(i=0;i<this->n;i++)	
    	T[i]=this->t[i];
    	this->t=new Rendezvous[this->n+2];
    	for(i=0;i<this->n;i++)
    		this->t[i]=T[i];
     
    	this->n=this->n+1;
    	printf("**************\n");
    	this->t[this->n]=rv;
     
    }

  6. #6
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Si tu ne peux pas utiliser la STL, rien ne t'empeche de coder un équivalent de std::vector qui s'adapterait à tes besoins ? C'est loin d'être insurmontable.

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    je viens de le faire mais ca beug :beug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    agenda::operator +(Rendezvous &rv){
     
    	int i=0;
    	Rendezvous *T=new Rendezvous[this->n+1];
    	for(i=0;i<this->n;i++)	
    	    T[i]=this->t[i];
     
     
    }
    Salut,
    J'usqu'à la tout va bien c'est ensuite que ça se gâte.

    Tu dois libérer l'ancienne allocation mémoire et faire pointer this->t sur la nouvelle. Ensuite copie rv dans l'emplacement [n] et incrémente n.
    Ca devrait marcher.

    Sinon je ne comprend pas pourquoi tu ne peux pas utiliser la STL, sauf si c'est un exercice.
    Autre remarque : l'opérateur += serait plus approprié ici car habituellement l'opérateur + ne modifie aucun de ses opérandes, ça peut rendre la lecture de ton code confuse.

    a+
    jmv

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par jmv Voir le message
    Salut,
    J'usqu'à la tout va bien c'est ensuite que ça se gâte.

    Tu dois libérer l'ancienne allocation mémoire et faire pointer this->t sur la nouvelle. Ensuite copie rv dans l'emplacement [n] et incrémente n.
    Ca devrait marcher.

    Sinon je ne comprend pas pourquoi tu ne peux pas utiliser la STL, sauf si c'est un exercice.
    Autre remarque : l'opérateur += serait plus approprié ici car habituellement l'opérateur + ne modifie aucun de ses opérandes, ça peut rendre la lecture de ton code confuse.

    a+
    jmv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    agenda::operator +(Rendezvous &rv){
     
    	int i=0;
     
    	Rendezvous *T=new Rendezvous[this->n+1];
     
    	for(i=0;i<this->n;i++){	
    	T[i].p.mois=this->t[i].p.mois;
    	t[i].p.anne=this->t[i].p.anne;
    	t[i].p.jour=this->t[i].p.jour;
    	t[i].s.copy(this->t[i].s.str);
    }
    	this->t=new Rendezvous[this->n+2];
    	for(i=0;i<this->n;i++){
    	this->t[i].p.mois=T[i].p.mois;
    	this->t[i].p.anne=T[i].p.anne;
    	this->t[i].p.jour=T[i].p.jour;
    	this->t[i].s.copy(T[i].s.str);
    	}
    	this->n=this->n+1;
     
    	this->t[i].p.mois=rv.p.mois;
    	this->t[i].p.anne=rv.p.anne;
    	this->t[i].p.jour=rv.p.jour;
    	this->t[i].s.copy(rv.s.str);
     
     
     
    }
    ca beug pas mais quand je reallou la memoire je perd mes données

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    agenda::operator +(Rendezvous &rv){
    
    	int i=0;
    
    	Rendezvous *T=new Rendezvous[this->n+1];
    
    	for(i=0;i<this->n;i++){	
    	T[i].p.mois=this->t[i].p.mois;
    	t[i].p.anne=this->t[i].p.anne;
    	t[i].p.jour=this->t[i].p.jour;
    	t[i].s.copy(this->t[i].s.str);
    }
    	this->t=new Rendezvous[this->n+2];
    	for(i=0;i<this->n;i++){
    	this->t[i].p.mois=T[i].p.mois;
    	this->t[i].p.anne=T[i].p.anne;
    	this->t[i].p.jour=T[i].p.jour;
    	this->t[i].s.copy(T[i].s.str);
    	}
    	this->n=this->n+1;
    	
    	this->t[i].p.mois=rv.p.mois;
    	this->t[i].p.anne=rv.p.anne;
    	this->t[i].p.jour=rv.p.jour;
    	this->t[i].s.copy(rv.s.str);
    
    
    	
    }
    ca beug pas mais quand je reallou la memoire je perd mes données
    Lol ça fait 4 heurs que je cherche un beug et ce beug vient d’une faute d’inattention
    probléme

  10. #10
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Bien que personnellement je ne ferai pas comme ça, je te propose ce code qui est le plus proche possible du tiens, essaye ça, j'ai pas vérifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    agenda::operator +(Rendezvous &rv){
     
    	int i=0;
     
    	// allocation de la mémoire
    	Rendezvous *T=new Rendezvous[this->n+1];
     
    	// on copie les données
    	for(i=0;i<this->n;i++)	 {
    		T[i].p.mois=this->t[i].p.mois;
    		T[i].p.anne=this->t[i].p.anne;
    		T[i].p.jour=this->t[i].p.jour;
    		T[i].s.copy(this->t[i].s.str);
    	}
     
    	// on ajoute rv
    	this->t[i].p.mois=rv.p.mois;
    	this->t[i].p.anne=rv.p.anne;
    	this->t[i].p.jour=rv.p.jour;
    	this->t[i].s.copy(rv.s.str);
     
    	// on détruit l'ancienne alloc mémoire et on fait pointer t sur la nouvelle
    	delete this->t;
    	this->t = T;
     
    	// on incrémente n
    	this->n=this->n+1;
    }
    [edit]j'ai corrigé t par T[/edit]

  11. #11
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Pas si résolu que ça, tu as 2 new sans un seul delete.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 27
    Points : 46
    Points
    46
    Par défaut
    Edit : désolé, j'ai pas été assez rapide, tu t'en es déjà rendu compte

    Citation Envoyé par dot-_-net Voir le message
    [CODE]agenda::operator +(Rendezvous &rv){

    int i=0;

    Rendezvous *T=new Rendezvous[this->n+1];

    for(i=0;i<this->n;i++){
    T[i].p.mois=this->t[i].p.mois;
    t[i].p.anne=this->t[i].p.anne;
    t[i].p.jour=this->t[i].p.jour;
    t[i].s.copy(this->t[i].s.str);
    }
    Il y a une erreur de majuscules là : t[i] et this->t[i] sont les mêmes éléments. essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	for(i=0;i<this->n;i++){	
    	T[i].p.mois=this->t[i].p.mois;
    	T[i].p.anne=this->t[i].p.anne;
    	T[i].p.jour=this->t[i].p.jour;
    	T[i].s.copy(this->t[i].s.str);

  13. #13
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Citation Envoyé par jmv Voir le message
    Pas si résolu que ça, tu as 2 new sans un seul delete.
    D’après mes connaissance je pense que new écrase la mémoire allouer et alloue une autre donc pas besoin a faire des deletes

  14. #14
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    D’après mes connaissance je pense que new écrase la mémoire allouer et alloue une autre donc pas besoin a faire des deletes
    Non, new ne fait qu'allouer un nouvel espace mémoire.
    En règle générale : à chaque new doit correspondes un delete.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Et oublie pas de faire en sorte que ton code soit exception-safe
    Boost ftw

  16. #16
    Membre actif
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Points : 294
    Points
    294
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int agenda::load(){
    FILE *f;
    int i=0;
    f=fopen("agenda.dat","rb");
    while(!feof(f)){
    this->t=(Rendezvous *) realloc(this->t,i+1);
    fread(&this->n,sizeof(n),1,f);
    fread(&this->t[i].s,sizeof(this->t[i].s.str),1,f);
    fread(&this->t[i].p.jour,sizeof(int),1,f);
    fread (&this->t[i].p.mois,sizeof(int),1,f);
    fread(&this->t[i].p.anne,sizeof(int),1,f);
    i++;
    }
    fclose(f);
    return 0;
    }
    pour quoi ca beug ici??

  17. #17
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par dot-_-net Voir le message
    Argh!!! ne me dis pas que tu ne peux pas utiliser les flux non plus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de réallocation et de Assert (?)
    Par beegees dans le forum Bibliothèque standard
    Réponses: 34
    Dernier message: 23/01/2008, 22h20
  2. [C] [libxml] problème de libération de la mémoire
    Par radouane_as dans le forum XML
    Réponses: 3
    Dernier message: 16/01/2008, 10h58
  3. [débutant] Problèmes d'arrondis et de mémoire
    Par etudiant en hydro dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2007, 11h00
  4. problème de taille et de mémoire
    Par soria_t dans le forum C
    Réponses: 31
    Dernier message: 22/02/2007, 08h58
  5. Problème de gestion de la mémoire
    Par johnbob789 dans le forum Langage
    Réponses: 6
    Dernier message: 28/11/2006, 20h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo