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 fuites mémoire


Sujet :

C++

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut Problème de fuites mémoire
    Bonjour,

    Comme je suis encore débutant en programmation... J'ai des fuites. Alors j'ai une question, je vous montre le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename TYPE> void Array<TYPE>::Reverse(TYPE* Sequence, int TailleSequence)
    {
    	TYPE SeqAlt[TailleSequence];
     
    	for (int i=0 ; i < TailleSequence ; i++)
    	{
    		SeqAlt[i] = Sequence[TailleSequence-1-i];
    	}
    	delete[] Sequence;
    	Sequence = SeqAlt;
    }
    Le but du jeu ici est de changer l'ordre du tableau. Pour ce faire, je crée un nouveau tableau de la même taille, nommé SeqAlt, puis j'affecte les valeurs de Sequence à SeqAlt.

    Jusque là rien de bien méchant on dirait. Mais problème, valgrind me dit qu'il y a une fuite de mémoire ; normal, le tableau Sequence n'est pas libéré... Donc, je mets un "delete[] Sequence" avant de faire la nouvelle affectation.

    Où est le problème, selon vous ?
    (Alors, 1. non, je ne voulais pas utiliser les std::vector, et 2. je voulais que SeqAlt ne soit pas en retour de la fonction mais bien passé en adresse)

    Le compilateur ne dit rien, mais à l'éxecution ça râle beaucoup...
    Sans le delete[], ça ne bug plus, mais il y a me semble-t-il des fuites de mémoire...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename TYPE> void Array<TYPE>::Reverse(TYPE* Sequence, int TailleSequence)
    {
    	for (int a=0,b=TailleSequence-1 ; a < TailleSequence ; a++,b--)
    		Sequence[a]= Sequence[b];
    }
    De plus faire un delete dans ta fonction Reverse n'est sémentiquement pas correct. Cette fonction a pour but d'inverser les elements d'un tableau, point.
    Donc eviter de suprimer un emplacement mémoire passé en argument. C'est typiquement un example d'un type de programmation a éviter autant que faire ce peu.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    OOps au temps pour moi.
    Cela dit remarques interessantes.

  4. #4
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    @loufoque :

    - Pour le TYPE SeqAlt[TailleTableau], en effet je suis d'accord avec toi : en fait dans la fureur d'essayer de trouver une solution j'ai écrit ça :'(
    Au départ, j'avais bien écrit
    TYPE * SeqAlt;
    SeqAlt = new TYPE[TailleTableau];

    Voilà pourquoi j'utilisais delete[].

    - En quoi ma fonction n'a absolument aucun effet ? Ce que je veux faire, c'est inverser des indices ^^
    - Array est juste un template qui ne contient que quelques fonctions static.
    - Pour les swaps... je regarde.

    Enfin merci.

  5. #5
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Le Barde Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename TYPE> void Array<TYPE>::Reverse(TYPE* Sequence, int TailleSequence)
    {
    	TYPE SeqAlt[TailleSequence];
     
    	for (int i=0 ; i < TailleSequence ; i++)
    	{
    		SeqAlt[i] = Sequence[TailleSequence-1-i];
    	}
    	delete[] Sequence;
    	Sequence = SeqAlt;
    }
    Principale erreur :

    Tu change Sequence, mais mal ^^
    Sequence = SeqAlt;
    Ceçi ne fait que changer l'adresse du pointeur Sequence. Mais tu en a une copie, donc ta variable Sequence passée a ta fonction ne sera pas changée.

    Solution Simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reverse(TYPE * & Sequence, int TailleSequence)

  6. #6
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    En utilisant un vector, tu peux aussi utiliser reverse pour ce même effet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector <int> vector; // On dit que tu ajoutes 1, 2, 3, 4, 5, 6 dedans...
    std::reverse (vector.begin(), vector.end()) // Tu auras 6, 5, 4, 3, 2, 1.
    Si tu tiens vraiment à créer un autre tableau, avec reverse_copy ça sera idéal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector <int> vector; // On dit que tu ajoutes 1, 2, 3, 4, 5, 6 dedans...
    std::vector <int> vector2 (vector.size()); // Il faut que le second vecteur ait la // même taille que le premier
    std::reverse_copy vector.begin(), vector.end(), vector2.begin()) // Tu auras 6, 5, 4, 3, 2, 1 dans le vector2, vector restera inchangé

  7. #7
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Ah ouiiii, c'était donc ça

    Merci beaucoup, c'est exactement ce que je voulais faire.

  8. #8
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Vu Bakura, nos posts se sont croisés
    Je vais peut-être en passer par les vector pour plus tard, mais au départ je préférais ne pas en passer par là

  9. #9
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Je parlais de vector, mais tu peux très bien utiliser un simple tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int monTableau[] = {1, 2, 3, 4, 5};
    std::reverse (monTableau, monTableau + 5);
    Et avec reverse_copy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int monTableau[] = {1, 2, 3, 4, 5};
    int monTableau2[5]; // Nombre d'éléments du tableau 1
    std::reverse_copy (monTableau, monTableau + 5, monTableau2);
    Beaucoup d'algorithmes de la STL peuvent être utilisés sans pour autant utiliser des vector, des list ou des deque. C'est juste que c'est un peu moins pratique.

  10. #10
    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
    En prenant Sequence par référence, tu vas donc faire pointer ton pointeur Sequence (externe à la fonction) à un tableau qui est une variable locale de ta fonction. Variable locale qui n'existe plus.

    - Array est juste un template qui ne contient que quelques fonctions static.
    Erreur de conception, donc.
    Tes fonctions ne devraient pas être des fonctions membres statique d'une classe template Array, mais tout simplement des fonctions libres templates, tout comme std::reverse.

  11. #11
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Merci beaucoup, ça fonctionne mieux

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut


    Si oui, pense à cliquer sur le bouton ad-hoc

  13. #13
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Oh, je manque à tous mes devoirs, aujourd'hui.

    [RÉSOLU].

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

Discussions similaires

  1. [SL3]Probléme de fuite mémoire
    Par Archeone dans le forum Silverlight
    Réponses: 5
    Dernier message: 11/03/2010, 12h04
  2. [OpenOffice][Tableur] problème de fuites mémoires
    Par sephial dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 23/11/2009, 17h26
  3. [VB6] Problème de fuite mémoire
    Par GyLes dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/03/2007, 14h58
  4. [C++] problème de fuite mémoire
    Par Cirdan Telemnar dans le forum C++
    Réponses: 26
    Dernier message: 16/06/2006, 10h16
  5. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29

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