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 �clair�
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    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 confirm�
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    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 confirm�
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

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

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

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    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 exp�riment� Avatar de Kujara
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    262
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 262
    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 : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    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 �clair�
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par d�faut
    Ah ouiiii, c'�tait donc �a

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

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

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    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 : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    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
    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 �clair�
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Par d�faut
    Merci beaucoup, �a fonctionne mieux

  12. #12
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut


    Si oui, pense � cliquer sur le bouton ad-hoc
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

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

    Informations professionnelles :
    Activit� : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    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