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

Qt Discussion :

fuite mémoire QValueList


Sujet :

Qt

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut fuite mémoire QValueList
    Bonjour,

    J'utilise Qt 3.3.4 sous linux.

    J'ai codé un petit programme :

    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
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include <qglobal.h>
    #include <qvaluelist.h>
     
     
    class test
    {
    public :
    	void essai()
    	{
    		QValueList <int>list;
     
    		for(int i=0;i<1000000;i++)
    			list.append(i);
    		qDebug("entreLes2");
    		sleep(5);
    		for(int i=0;i<1000000;i++)
    			list.append(i);
    		sleep(5);
    		list.clear();
    	}
     
    };
     
    int main()
    {
     
    	qDebug("avant");
    	test toto;
    	toto.essai();
     
    	qDebug("apres");
     
    	sleep(100);
     
    	return 0;
    }
    Ce programme devrait :
    1 - afficher "avant"
    2 - créer l'objet toto
    3 - créer une QValueList
    4 - ajouter à cette dernière 1000000 valeurs et faire monter en conséquence la mémoire VmSize
    5 - afficher "entre les deux"
    6 - ajouter à la même liste 1000000 valeurs et faire monter en conséquence la mémoire VmSize
    7 - effacer tous les éléments de la liste et libérer la mémoire VmSize en conséquence
    8 - détruire l'objet QValueList
    9 - afficher "apres"
    10 - attendre 100 secondes
    11 - détruire l'objet toto

    Malheureusement, ni à l'étape 7, ni à l'étape 8, la mémoire VmSize n'est libérée.
    La mémoire n'est libérée qu'à l'étape 11.

    Avez-vous une idée ?

    Merci par avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par camillechambon Voir le message
    Malheureusement, ni à l'étape 7, ni à l'étape 8, la mémoire VmSize n'est libérée.
    La mémoire n'est libérée qu'à l'étape 11.

    Avez-vous une idée ?

    Merci par avance.
    Bonjour,
    Comment fait tu pour savoir que ce n'est pas libéré?
    Sinon, Qt utilise une gestion mémoire propre. Pour des raison de performance (évite des allocation/ desallocation inutile). Il est donc propable qu'il de désaloue pas pour cette raison.
    Ton code est correcte.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Je regarde le VmSize dans /proc/[pid]/status

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    essaie ce code.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <qglobal.h>
    #include <qvaluelist.h>
     
     struct A
    {
    A(const int &i) :m_val(i){}
    ~A() {qDebug("destruction A");}
    int m_val;
    }
    class test
    {
    public :
    	void essai()
    	{
    		QValueList <A>list;
     
    		for(int i=0;i<1000000;i++)
    			list.append(A(i));
    		qDebug("entreLes2");
    		sleep(5);
    		for(int i=0;i<1000000;i++)
    			list.append(A(i));
    		sleep(5);
    		list.clear();
    	}
     
    };
     
    int main()
    {
     
    	qDebug("avant");
    	test toto;
    	toto.essai();
     
    	qDebug("apres");
     
    	sleep(100);
    	return 0;
    }
    Ainsi tu verra quand sont détruit les objet A.
    Sinon, une autre possibilité est que tu utilise sleep. Peut être que ça empêche la mise a jour et qu'il te semble donc que ça na pas été désalloué.

    Toute façon ton code n'as pas de fuite mémoire.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    Je travaille avec camillechambon et je pense qu'on a trouvé d'où venait le problème. L'augmentation de la mémoire proviendrait de la stl et non pas des qvaluelist elles-mêmes. Il semble qu'à chaque création d'une liste la mémoire n'est pas désallouée de façon à ne pas faire sans cesse des allocations/désallocations, est-ce un bug ou est-ce fait sciemment je ne sais pas.
    Toujours est-il que la solution trouvée (qui est valable pour notre problème peut-être pas pour tous) est d'utiliser une variable statique et de faire un list.clear() à la fin de la fonction.
    De cette façon la mémoire est allouée au premier appel de la fonction une fois pour toute, et il n'y a plus de fuite à chaque appel de cette méthode.
    Merci pour l'aide apportée.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par slymira Voir le message
    Bonjour,
    Je travaille avec camillechambon et je pense qu'on a trouvé d'où venait le problème. L'augmentation de la mémoire proviendrait de la stl et non pas des qvaluelist elles-mêmes. Il semble qu'à chaque création d'une liste la mémoire n'est pas désallouée de façon à ne pas faire sans cesse des allocations/désallocations, est-ce un bug ou est-ce fait sciemment je ne sais pas.
    Toujours est-il que la solution trouvée (qui est valable pour notre problème peut-être pas pour tous) est d'utiliser une variable statique et de faire un list.clear() à la fin de la fonction.
    De cette façon la mémoire est allouée au premier appel de la fonction une fois pour toute, et il n'y a plus de fuite à chaque appel de cette méthode.
    Merci pour l'aide apportée.
    ... j'ai des doute pour la STl. A moins que vous utilisé une liste de pointeur.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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