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 :

Probleme mémoire avec QList


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut Probleme mémoire avec QList
    Bonjour.

    Voici le petit souci que je rencontre actuellement :

    J'ai une classe classA qui a pour attribut une QList contenant des pointeurs vers des objets de classe classB (donc QList<classB *>).
    Avec les accesseurs qui vont tout bien.

    J'ai une classe classEngine qui contient une QList contenant des pointeurs vers des objets de classe classA.

    Dans cette classe classEngine j'ai une fonction qui à le prototype suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<classB*> classEngine::getAllObjectsB() const
    qui a pour but de me construire la liste des tous les elements de classB de mon application en parcourant la liste des elements de classA en recuperant leur liste de classB.

    Voici son implémentation :

    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
    QList<classB*> classEngine::getAllObjectsB() const
    {
     
    	classA * objectACourant;
    	classB * objectBCourant;
    	QList<classB *> retour;
     
    	QListIterator<classA *> iterObjectClassA(this->getObjectClassAList());
     
    	while (iterObjectClassA.hasNext()) {
     
    		// Recup objet courant de la liste
    		objectACourant = iterObjectClassA.next();
     
    		// Iterateur sur la liste d'objet de type classB pour chaque objet de classA
    		QListIterator<classB*> iterObjectClassB(objectACourant->getObjectClassBList());
     
    		while (iterObjectClassB.hasNext()) {
     
    			objectBCourant = iterObjectClassB.next();
    			retour.push_back(objectBCourant);
    		}
    	}
     
    	return retour;
    }
    Je veux donc simplement récupèrer une liste contenant des pointeurs vers mes objets B.

    Le souci c'est que quand j'appelle cette fonction,
    j'obtiens une erreur mémoire et l'appli crash.

    J'ai ciblé l'erreur sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour.push_back(objectBCourant);
    mais pour moi le push_back devrait agir comme si c'était une variable normale (un entier ou autre) mais apparemment il semble faire un peu plus que çà.

    Avez vous une idée d'où cela peut provenir ? Je pense que je passe à côté de quelque chose, et cela doit être tellement énorme que je ne le vois pas. J'ai donc besoin d'un oeil frais qui ne rumine pas çà depuis des heures

    Merci d'avance.

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Il faut peut-être allouer les objets pour les insérer dans ce conteneur.

    retour.push.back( new objectBCourant( ??? ) ) ;

    Ensuite la question de la libération de tous ces pointeurs.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut
    En fait l'objet a été alloué ailleurs et sa référence a été ajoutée dans la liste "ClassBList" de l'objet classA.
    Et je veux simplement repusher dans cette nouvelle liste les mêmes références.
    Donc normalement je n'ai pas besoin de réallouer quelque chose.
    L'allocation pour la variable contenant la référence est faite quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classB * objectBCourant
    Ce qui est "tout au bout" a été alloué bien avant.

    Je pense effectivement que le problème viendrai plutôt d'une libération qui se fait à un endroit où je ne voudrais pas qu'elle se fasse.

  4. #4
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Pour commencer, utiliser QList pour faire ça est totalement inutile et risqué:
    QList<T> == QVector<T*>

    Utilises donc des vectors pour stocker tes pointeurs, ce sera plus sage ; ensuite, QVector dispose d'une surcharge operator+= qui te permettra de construire ton type de retour nettement moins verbeusement. QList dispose pour ça d'une méthode append().

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut
    J'ai effectivement testé, et cela fonctionne mais je t'avouerais que je reste intrigué par tout çà.

    Pourquoi dis tu que c'est plus risqué avec une QList ?

  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 IrmatDen Voir le message
    Salut,

    Pour commencer, utiliser QList pour faire ça est totalement inutile et risqué:
    QList<T> == QVector<T*>
    et
    QList<T*> == QVector<T*>
    http://qt.developpez.com/doc/latest/qlist.html#details

    en quoi c'est risqué?

  7. #7
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par yan Voir le message
    En effet, je ne me souvenais plus de ce point
    Je devais pas être en grande forme l'autre soir, désolé

    Avant d'utiliser QVector, as-tu tenté d'utiliser QList::append ou QList::operator+= pour remplacer ton itération à la mano ?

    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
    QList<classB*> classEngine::getAllObjectsB() const
    {
     
    	classA * objectACourant;
    	classB * objectBCourant;
    	QList<classB *> retour;
     
    	QListIterator<classA *> iterObjectClassA(this->getObjectClassAList());
     
    	while (iterObjectClassA.hasNext()) {
     
    		// Recup objet courant de la liste
    		objectACourant = iterObjectClassA.next();
     
    		// Iterateur sur la liste d'objet de type classB pour chaque objet de classA
    		retour += iterObjectClassB(objectACourant->getObjectClassBList());
    	}
     
    	return retour;
    }
    PS: je n'ai pas l'habitudes des itérateurs Java-style, j'ai immédiatement pensé que tu stockais des pointeurs vers les objets et non les objets (dans ton cas, objet signifie "ClassB*").

    push_back (enfin, append) ne fait pas grand chose dans ce cas en effet ; il fait simplement une copie de la valeur que tu lui passes (à savoir ton pointeur).

  8. #8
    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
    Au faite, classB dérive de QObject?
    Si oui, tu pourrais utilise des QPointer au lieu de pointeur.
    http://qt.developpez.com/doc/latest/...r.html#details

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut
    J'ai essayé de dépatouiller mon truc, il s'avère qu'après quelques changements, cela fonctionne maintenant.

    Mais je suis toujours curieux de connaître pourquoi le fait d'utiliser une liste est risqué ?

  10. #10
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par Kimado Voir le message
    Mais je suis toujours curieux de connaître pourquoi le fait d'utiliser une liste est risqué ?
    Y'en a pas spécialement, j'ai mal lu comme dit dans mon précédent post

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 163
    Points : 74
    Points
    74
    Par défaut
    Ok. Merci bien pour vos réponses alors.
    Me voilà rassurer


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

Discussions similaires

  1. [MySQL] probleme mémoire avec mysql
    Par lol88 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 20/04/2010, 11h15
  2. Probleme de mémoire avec MappedByteBuffer: JavaOutOfMemory
    Par nakata77 dans le forum Général Java
    Réponses: 1
    Dernier message: 01/04/2010, 18h42
  3. Probleme de mémoire avec libpq
    Par kobton dans le forum C
    Réponses: 2
    Dernier message: 13/01/2009, 10h02
  4. Probleme de mémoire avec FireBird
    Par NicolasR dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/05/2006, 16h28
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

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