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

Discussion :

QList : removeAt et suppression du dernier élément

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 289
    Par défaut QList : removeAt et suppression du dernier élément
    Bonjour, c'est simple, quelqu'un peut me dire pourquoi y'a pas moyen de supprimer le dernier élément d'un QList avec removeAt ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QList<QString>* test = new QList<QString>;
    test->insert(0, "test1");
    test->insert(1, "test2");
    test->insert(2, "test3");
    qDebug() << test->at(2);
    test->removeAt(2);
    qDebug() << test->at(2);
    Terminées les prises de tête pour programmer en php. On procède comme ça : http://cavril.developpez.com/php/ (débutants pressés voulant éviter d'approfondir vers la POO)

  2. #2
    Membre émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    Par défaut
    Ton élément est supprimé, affiche la taille de la liste pour confirmation.
    Accéder à un élément invalide provoque un comportement indéterminé, ie le programme fait n'importe quoi. En particulier, il peut aller chercher dans la mémoire à l'ancien emplacement de l'élément et faire comme s'il était encore présent. Et si la mémoire n'a pas été modifiée, tu auras l'impression que l'élément n'est pas supprimé de la liste.
    Donc toujours tester l'accès à un élément avant de le faire.
    HS : pas de raison de créer un pointeur de QList

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 278
    Par défaut
    Il fat aussi savoir que Qt est conçu pour optimiser les appels mémoire. Ton élément est supprimé mais son espace mémoire est non libéré.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 289
    Par défaut
    Citation Envoyé par mintho carmo Voir le message
    Ton élément est supprimé, affiche la taille de la liste pour confirmation.
    Accéder à un élément invalide provoque un comportement indéterminé, ie le programme fait n'importe quoi. En particulier, il peut aller chercher dans la mémoire à l'ancien emplacement de l'élément et faire comme s'il était encore présent. Et si la mémoire n'a pas été modifiée, tu auras l'impression que l'élément n'est pas supprimé de la liste.
    Donc toujours tester l'accès à un élément avant de le faire.
    HS : pas de raison de créer un pointeur de QList
    Si j'utilise un pointeur c'est qu'en fait j'en ai besoin, dans le code d'origine il s'agit d'une variable membre. Le programme plante quand par exemple on appelle test->at(12). Je ne comprends pas pourquoi il ne plante pas quand on appelle test->at(2), si la méthode était pondue correctement, ça devrait planter. Je teste l'affichage de size dès que possible.
    Terminées les prises de tête pour programmer en php. On procède comme ça : http://cavril.developpez.com/php/ (débutants pressés voulant éviter d'approfondir vers la POO)

  5. #5
    Membre émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    Par défaut
    Si j'utilise un pointeur c'est qu'en fait j'en ai besoin, dans le code d'origine il s'agit d'une variable membre.
    Quel rapport ?
    Non, il n'y a a priori aucune raison de créer un pointeur de QList

    si la méthode était pondue correctement, ça devrait plante
    C'est une question de choix de conception. En C++, on considère que c'est au développeur de faire les choses correctement, pas à la lib de vérifier les erreurs des devs (parce que cela à un coût sur les performances).

    Donc ajoute un assert à chaque fois que tu utilises un pointeur ou accède à un tableau

  6. #6
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 289
    Par défaut
    Citation Envoyé par mintho carmo Voir le message
    Quel rapport ?
    Non, il n'y a a priori aucune raison de créer un pointeur de QList


    C'est une question de choix de conception. En C++, on considère que c'est au développeur de faire les choses correctement, pas à la lib de vérifier les erreurs des devs (parce que cela à un coût sur les performances).

    Donc ajoute un assert à chaque fois que tu utilises un pointeur ou accède à un tableau
    Typiquement, il vaut mieux utiliser des pointeurs pour les variables membres pour une classe histoire de pas avoir d'objet pesant.
    Je vérifierai dès que possible le size, mais s'il s'avère que le size ne change pas quand on enlève un élément, il sera clair que la définition de removeAt est erronée quelle qu'en soit la raison.
    Terminées les prises de tête pour programmer en php. On procède comme ça : http://cavril.developpez.com/php/ (débutants pressés voulant éviter d'approfondir vers la POO)

  7. #7
    Membre émérite

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 403
    Par défaut
    Citation Envoyé par Ah_Kin Voir le message
    Typiquement, il vaut mieux utiliser des pointeurs pour les variables membres pour une classe histoire de pas avoir d'objet pesant.
    Combien "pèse" un QList ? Sais tu comment est implémenté une liste ? Ce qu'est le COW ou implicit sharing ?

    Je te demandais pas pour quelle raison tu avais utilisé un pointeur. Je te disais juste qu'il ne fallait pas. Si tu penses avoir de bonnes raisons pour croire cela, sois tu es un expert en C++ et Qt et tu n'as pas besoin de vérifier ce que tu penses, soit ce n'est pas le cas et tu devrais peut être vérifier ce que tu crois quand on te dis que tu fais une erreur.

  8. #8
    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
    Salut,
    Citation Envoyé par Ah_Kin Voir le message
    Typiquement, il vaut mieux utiliser des pointeurs pour les variables membres pour une classe histoire de pas avoir d'objet pesant.
    Heu... Juste une question...

    Que se passe-t-il, selon toi, lorsque tu fait appel à new pour initialiser ton pointeur à une valeur correcte

    La réponse est simple : l'objet du type demandé est créé... Mais pas dans l'air du temps : en mémoire -->cout = poids de l'objet lui-même + poids du pointeur (car, oui, un pointeur a une emprunte mémoire, même si elle est "limitée" au type entier non signé susceptible de représenter "n'importe quelle adresse valide" )

    Alors, maintenant, tu pensais peut être quelque chose comme "... histoire de pas avoir d'objet pesant sur la pile".

    Mais là encore, tu as tout faux car, les collections dynamique ont toujours une emprunte mémoire excessivement faible sur la pile, ne serait-ce que parce que tous les éléments sont stocké... sur le tas.

    De plus -- et c'est particulièrement vrai avec Qt -- lorsqu'un objet est créé sur le tas (typiquement avec appel à new, comme tu le feras pour la plupart des classes dérivées de QObject et donc, sans doute pour n'importe quelle classe qui utilisera une QList), tous ses membres sont forcément créés dans le tas, et non dans la pile.

    Finalement, le seul cas où ta QList (enfin, ou une partie de ta QList) se trouvera dans la pile, c'est si tu crées une instance de QList comme variable locale d'une fonction. Et ca, ca n'aura (normalement) que très peu d'incidence, étant donné que cette variable locale sera détruite dés que l'on quittera la portée de la fonction

    Au final, je ne sais pas où tu as été pêcher ce genre de raisonnement, mais je suis au regret de te dire que cette justification n'a absolument rien de correct
    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

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

Discussions similaires

  1. gridview et suppression du dernier élément
    Par tortuegenie dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/07/2008, 15h43
  2. [EMF] suppression du dernier élément d une collection
    Par *alexandre* dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 02/04/2008, 08h25
  3. for-each et dernier élément
    Par neptune dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/09/2005, 14h53
  4. Comment récupérer l'index du dernier élément inséré ?
    Par Didier100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 22h41
  5. Réponses: 14
    Dernier message: 01/12/2003, 17h47

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