C++ Qt disparitions intriguantes d'objets dans un QVector
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

C++ Qt disparitions intriguantes d'objets dans un QVector



  1. #1
    herrmattoon

    C++ Qt disparitions intriguantes d'objets dans un QVector


    ------

    Bonjour,

    – Code C++ avec QT – J’ai un QList<XbeeNode> nodeList ; qui est initialisé à une taille de 200 items dans le constructeur de la classe qui le contient.

    Ces items sont des objets qui contiennent la description « réseau » de capteurs Xbee.

    Que je déclare un XbeeNode en « private » dans le .h ou que je le créé dans le heap avec new, le résultat est le même. Avant de sortir de la fonction qui affecte des valeurs aux attributs de mon nouvel objet XbeeNode avant de le stocker dans le QVector, ce dernier contient effectivement l’objet. Pourtant, quand je sors de cette méthode, le XbeeNode qui avait été placé dans le QVector a disparu !!

    Avez-vous des idées de ce qui a pu se passer ? Je me disais que peut-être, en créant l’objet dans la méthode, il allait disparaitre du stack et que le QVector ne garderait qu’un pointeur sur un objet disparu en sortant de la méthode. Pourtant, même avec new ou avec l’objet déclaré en « private » dans le .h, c’est la même chose qui se produit, alors que l’objet ne peut être détruit que par delete (?). De plus, je ne touche pas au QVector ailleurs pour l’instant… Et le QVector insert un objet et non une référence (?).

    Merci d’avance pour vos précieux conseils !

    -----

  2. #2
    pm42

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Sans le code, c'est plus compliqué...

  3. #3
    herrmattoon

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Le voilà :

    Code:
    XbeeNode *XbeeNodeList::createXbeeNode(const QByteArray& addr64, const QByteArray& addr16, const QString& nodeId, quint8 deviceType)
    {
        //Create node object to store network info
        XbeeNode mynode;
        mynode.setAddr16(addr16);
        mynode.setAddr64(addr64);
        mynode.setDeviceType(deviceType);
        mynode.setNodeID(nodeId);
        //Used to tell the view a row has been added
        this->nodesCount++;
        //Insert the node in the QVector nodeList
        this->nodeList.insert(this->nodesCount-1,mynode);
        QModelIndex topLeft = createIndex(0,0);
        //Notify the view
        emit this->dataChanged(topLeft,topLeft);
        return &(this->nodeList.at(nodesCount-1));
    }
    A savoir que dans le .h -> QVector<XbeeNode>nodeList;

  4. #4
    Chanur

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Bonjour,
    A vu de nez je ne vois rien d'anormal dans cette méthode (c'est bizarre de mettre this-> à chaque fois que tu utilises un attribut, mais ça n'a pas d'importance).
    Mais il faudrait aussi que tu donne le code où tu appelles cette méthode et qui montre que ton XbeeNode a "disparu".
    Parce que là aussi, pour l'instant, on en est réduit à deviner ...

    Il y a aussi le fait qu'on ne connait pas la valeur de nodesCount.
    Dernière modification par Chanur ; 10/07/2017 à 18h50.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    2 problèmes : tu insères dans ton vecteur une valeur créée sur la pile dans ta méthode. Donc son destructeur est appelé en sortie...
    Ensuite, pourquoi insérer en nodeCount - 1 à chaque fois ? Pourquoi ne pas faire un append ?
    Ce qui donnerait :

    Code:
    XbeeNode* mynode = new XbeeNode();
    ...
    this->nodeList.append(*mynode);

  7. #6
    Chanur

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Citation Envoyé par pm42 Voir le message
    tu insères dans ton vecteur une valeur créée sur la pile dans ta méthode. Donc son destructeur est appelé en sortie...
    C'est vrai, mais ce n'est pas un problème, puisque l'appel nodeList.insert(this->nodesCount-1,mynode) passe à insert() une copie de mynode. Peut importe, donc que mynode soit détruit ensuite
    Citation Envoyé par pm42 Voir le message
    Ensuite, pourquoi insérer en nodeCount - 1 à chaque fois ? Pourquoi ne pas faire un append ?
    Ce qui donnerait :

    Code:
    XbeeNode* mynode = new XbeeNode();
    ...
    this->nodeList.append(*mynode);
    Là on passe aussi en argument une copie de *mynode, et on doit détruire soit-même mynode avant de sortir de createXbeeNode() sous peine d'avoir une fuite de mémoire. Ça revient au même.

    Je croirais plutôt que l'élément n'a pas disparu (mais en l'absence de code, je ne peux qu'imaginer).
    Déjà, on ne sait même pas si nodeList est un QList ou un QVector, et ça ne s'initialise pas de la même façon (par exemple il y a un constructeur QVector(int size) qui n'existe pas pour QList).

    Du coup, sans savoir comment est initialisée la liste, quelle est la valeur initiale de nodeCount et qu'est-ce qui laisse penser qu'un élément aurait disparu, il est impossible de répondre (difficile de debugger un programme sans avoir le droit de le lire).

    Par exemple, si c'est un QVector créé par QVector(200), il contient au départ 200 éléments initialisées avec le constructeur par défaut de XbeeNode, auxquels la méthode createXbeeNode() va ajouter un 201ème élément (en première position si nodeCount vaut 0 et en dernière si nodeCount est initialisée à 200). Je n'ai pas l'impression que c'est le comportement désiré ...
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  8. #7
    pm42

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Citation Envoyé par Chanur Voir le message
    C'est vrai, mais ce n'est pas un problème, puisque l'appel nodeList.insert(this->nodesCount-1,mynode) passe à insert() une copie de mynode.
    Non, on passe une référence. C'est dans la définition de insert de QVector.

    Citation Envoyé par Chanur Voir le message
    Là on passe aussi en argument une copie de *mynode, et on doit détruire soit-même mynode avant de sortir de createXbeeNode() sous peine d'avoir une fuite de mémoire. Ça revient au même.
    Non plus puisque c'est une référence.

  9. #8
    Chanur

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Oh oui, désolé, tu as raison.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  10. #9
    herrmattoon

    Re : C++ Qt disparitions intriguantes d'objets dans un QVector

    Bonjour à tous et un grand merci pour vos interventions!

    Honte à moi, en débuggant avec breakpoints pour documenter mon futur post dans cette discussion, j'ai remarqué que ma variable "nodeListCount" revenait à zéro alors que je ne l'avais décrémenté ou réinitialisé nulle part !! Je me suis donc dit que je devais créer quelque part un objet XbeeNodeList de trop! Et c'était le cas! J'initialise un pointeur sur un XbeeNodeList dans constructeur de "mainwindow" il devenait obsolète parce que je lui réassignais l'adresse d'un nouvel objet et c'est pour ça que mon "nodeListCount" retombait à zéro!

    Désolé pour le dérangement

Discussions similaires

  1. Déplacement des objets dans l'univers
    Par kdfmv dans le forum Archives
    Réponses: 56
    Dernier message: 21/03/2015, 12h22
  2. Disparitions de langages
    Par zb1000 dans le forum Epistémologie et Logique (archives)
    Réponses: 19
    Dernier message: 19/12/2009, 21h53
  3. Tracé d'objets dans l'espace
    Par invite1ff07f7c dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 09/11/2009, 23h37
  4. Répartir n objets dans k boites
    Par invite7ffe9b6a dans le forum Mathématiques du collège et du lycée
    Réponses: 16
    Dernier message: 12/01/2008, 02h50
  5. Objets mystérieux dans l'univers?
    Par invite0753a43a dans le forum Archives
    Réponses: 30
    Dernier message: 24/08/2007, 22h59