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 :

[Code Review] Suppression des objets?


Sujet :

Qt

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut [Code Review] Suppression des objets?
    Bonjour,

    Je me posais une question, à cause que je rencontre des double désallocations sur les pointeurs sur des éléments de Qt.
    Malgré que ces objets sont déclarés dans la classe, contruit dans la classe et logiquement détruit dans le destructeur de la classe, je me demande comment peut on faire quelque chose de propre.
    Car il me semble que Qt, si on lui donne un objet (disons un QTableWidgetItem) dans une QTableWidget, bah il ne faudra pas détruire le QTableWidgetItem.
    Cela peut sembler logique, car si nous demandons la destruction du QTableWidget, et que comme Qt est bien programmé, il détruire aussi les éléments dedans.
    Certes, mais finalement, dans le code, ça peut faire un peu barbare de ne pas faire les destructions de tout les éléments que l'on a dans sa classe.
    Donc je demande, quelle est la meilleure solution ( en évitant les bugs, et clarté du code ).

    Sachant, que je pense que détruire tous les éléments à la main, et mettre les pointeurs à NULL pourrait être une solution, sauf que le pointeur que garde Qt ne sera pas à NULL :s
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Qt a un système de parent/enfants.

    Si quand tu construis un objet de Qt (quel qu'il soit) tu lui donnes quelque chose de non nul comme parent, alors c'est le parent qui fera la destruction de l'objet.

    Cf : http://qt.developpez.com/faq/?page=g...tes#memoire-qt

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    C'est bien ce que je mettais rendu compte, mais dans le cas, ou que j'inclus des widgets dans un QLayout.. il faut que je détruise ces widgets à la main. ( Je crois ).
    Du coup je viens à me poser la question à chaque fois que je construit un objet, et que dans le pire des cas, je vais faire la destruction moi même, et corrigé si ça plante.
    Je trouve ( du moins ma méthode ) pas très bonne ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je me posais une question, à cause que je rencontre des double désallocations sur les pointeurs sur des éléments de Qt.
    Étrange. Qui est en cause du double delete ? Tu peux donner un exemple de code ? Si tu delete toi-même un objet Qt qui possède un parent, Qt saura s'en rendre compte et n'essaiera pas de le détruire par lui-même, donc pas de problème à priori.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    Perso, je suis d'accord avec le plantage ( suivant ce qui est dit dans la FAQ ).
    Je détruit un objet qui à un parent.
    De plus je ne vois pas comment Qt peut s'en rendre compte, surtout si lui il a une copie du pointeur que j'utilise.

    Un exemple:

    Dans mon dernier programme, les objets que je ne détruit pas moi même:

    5 QPushButton -> new QPushButton(this);
    1 QHBoxLayout -> globalHBox = new QHBoxLayout(centralBox);

    Effectivement, ils ont bien des parents à la construction.

    Par contre je détruit aussi moi même des objets qui ont des parents
    Une QFrame -> new QFrame(this);

    Le problème n'étant pas trop que si les objets qui ont des parents je les détruits pas, mais plutot que j'ai à réfléchir sur un point, et de plus qu'il se peut que la gestion de la mémoire ne se fasse pas instinctivement. ( Je détruis tout moi même ou Qt détruit tout lui même ).

    Je donne le code en pièces joints, mais je m'excuse d'avance devant le manque de clarté ( mal commenté et en court de développement ).
    Fichiers attachés Fichiers attachés
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je détruit un objet qui à un parent.
    De plus je ne vois pas comment Qt peut s'en rendre compte, surtout si lui il a une copie du pointeur que j'utilise.
    Quand tu fournis un parent à un objet, celui-ci s'enregistre dans la liste des enfants de son parent au moment de la construction, et s'en désenregistre à sa destruction. Le parent, de son côté, détruit ses enfants quand il est détruit.

    Si tu delete toi-même un objet qui a un parent, il va informer son parent qu'il est détruit (en se désinscrivant de sa liste des enfants) et voilà, personne d'autre n'essayera de le détruire.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Quand tu fournis un parent à un objet, celui-ci s'enregistre dans la liste des enfants de son parent au moment de la construction, et s'en désenregistre à sa destruction. Le parent, de son côté, détruit ses enfants quand il est détruit.

    Si tu delete toi-même un objet qui a un parent, il va informer son parent qu'il est détruit (en se désinscrivant de sa liste des enfants) et voilà, personne d'autre n'essayera de le détruire.
    C'est super, mais finalement, pourquoi j'aurais des double désallocations ...
    Je sais \o/
    Simplement, que si je demande la destruction du parent avant de détruire à la main les objets, et bah le parent, ne va pas me prévenir moi, de la destruction des objets.

    Par contre, j'ai toujours ce mini problème, que ça me gêne de réfléchir autant sur la destruction ou non des objets ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    C'est ce que je te demande !

    Normalement le débogeur te permet de localiser l'endroit du deuxième delete fautif.

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 855
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 855
    Points : 218 548
    Points
    218 548
    Billets dans le blog
    118
    Par défaut
    Zut, j'avais pas vu votre réponse ... et du coup j'avais édité.

    Mais lorsque je m'étais rendu compte du problème, le debuggueur me stopper net sur le delete.

    Et mince, maintenant ça ne plante plus :s.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/08/2009, 23h27
  2. NHibernate et la suppression des objets enfant
    Par Philenain dans le forum NHibernate
    Réponses: 5
    Dernier message: 24/08/2009, 09h20
  3. Suppression des objets touchant le bord
    Par Natrio dans le forum OpenCV
    Réponses: 0
    Dernier message: 23/02/2009, 14h28
  4. Réponses: 2
    Dernier message: 27/10/2008, 13h50
  5. Réponses: 2
    Dernier message: 30/03/2007, 11h49

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