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

  1. #1
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut Libération de la mémoire allouée pour les widgets enfants à leur destruction sans détruire le parent
    Bonjour à tous,
    voilà j'ai compris que Qt se charge de libérer la mémoire allouée aux widgets enfants quand on détruit le parent.

    cela me pose un petit soucis, mais peut être que j'ai pas tout capté...

    Pour vous expliquer simplement mon problème :

    - j'ai une classe FenetreParent qui est dérivée de QMainWindow
    - dans cette classe j'ai un bouton qui me permet d'ouvrir plusieurs FenetreFille (qui sont dérivées aussi de QMainWindow)
    pour les ouvrir le QPushButton renvoie avec une fonction membre de FenetreParent.
    Dans cette fonction je créé une FenetreFille de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FenetreFille *fille = new FenetreFille(this);
    Jusque là tout est normal.
    Je précise que chaque FenetreFille me permet d'afficher de gros fichiers csv.

    Grace à cette fonction membre de création de FenetreFille par new, je peux obtenir de multiples fenetres à l'écran et c'est ce que je cherche à faire.
    Jusque là tout va bien

    Sauf que lorsque je ferme une FenetreFille, la mémoire allouée n'est pas libérée, et mon ordinateur rame de plus en plus.
    Comment puis je libérer la mémoire allouée à une FenetreFille à sa fermeture, si je ne détruit pas le parent.

    Je précise qu'à la fermeture du parent toutes les FenetreFille sont bien détruites.
    Quelqu'un saurait m'aider?
    merci
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  2. #2
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    Je propose une solution mais j'aimerai savoir si c'est correct dans la phylosophie de Qt de procéder ainsi?

    En gros, je vais faire un delete this lors de la fermeture (closeEvent) des FenetreFille comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void FenetreFille::closeEvent(QCloseEvent *event) 
    {
        delete this;
    }
    Le destructeur est ainsi bien appelé et donc je pense que la mémoire allouée est libérée.
    Mais est ce politiquement correcte de coder comme cela en Qt?
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  3. #3
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    Heuuu... j suis tout seul sur ma planète? mdr

    Bon trêve de plaisanterie, je pense avoir trouvé la bonne solution, du moins celle qui semble correspondre à l'esprit Qt

    En fait il suffit de rajouter un attribut à chaque FenetreFille juste après leur création comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FenetreFille *fille = new FenetreFille(this);
    fille->setAttribute(Qt::WA_DeleteOnClose); // permet de faire un delete automatiquement lors d'un QCloseEvent de fille
    Et voilà le tour est joué!
    J'espère que ça sera utile à d'autres.
    A bientôt pour de nouvelles questions et peut être réponses
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Concernant la première solution, il est risqué d'utilisé delete directement dans le corps d'une fonction de l'objet qui est détrui. Je pense que cela va engendrer un crash du programme. Par contre il y a une autre façon de faire avec Qt, qui permet de détruire un objet en "différé":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void FenetreFille::closeEvent(QCloseEvent *event) 
    {
        this->deleterLater();
    }
    Bien sûre la solution utilisant est tout aussi valide. Par contre il serait encore plus simple de placer cet appel dans le constructeur de FenetreFille afin de rendre cela "automatique", enfin c'est du chipotage, le résultat sera le même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FenetreFille::FenetreFille(QWidget *parent) : 
        QWidget(parent)
    {
        //Code d'initialisation de classe
        this->setAttribute(Qt::WA_DeleteOnClose);
    }
    Sinon, je vais faire mon chiant, mais il serait bien d'appliquer ce qui est dis dans votre signature

  5. #5
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    Merci pour la réponse,
    Pour ma signature, je l'ai faite il y a plus de 8 ans je pense, et depuis j'ai un peu laissé tomber le forum donc j'ai perdu cette bonne habitude.
    Mais cette fois c'est volontaire, effectivement je n'ai pas mis le sujet en résolu parce que personne n'avait encore confirmé mes hypothèses.

    C'est chose faite donc je valide.

    Merci Gojir4.
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Citation Envoyé par katanaenmousse Voir le message
    Mais cette fois c'est volontaire, effectivement je n'ai pas mis le sujet en résolu parce que personne n'avait encore confirmé mes hypothèses.
    Autant pour moi

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    Le lien parent/enfant ne devrait être utilisé que quand un élément ne peut effectivement pas exister si son parent cesse d'exister (par exemple : un bouton dans une fenêtre).

    Dans ta situation, à moins de garder une trace de toutes les fenêtre ouvertes dans une collection quelconque (mais, est-ce que cela a vraiment du sens ), les fenêtre créées lors du clique sur le bouton ont une durée de vie limitée à leur durée d'exécution qui, soit dit en passant, empêchera sans doute ta "fenêtre principale" (celle qui contient le bouton provoquant l'ouverture de cette fenêtre supplémentaire) de faire quoi que ce soit d'autre en attendant.

    Dés lors, le plus facile est -- peut-être -- tout simplement de n'avoir pas recours à l'allocation dynamique de la mémoire pour créer cette fenetre "secondaire", sous une forme qui pourrait être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void FenetrePrincipale::trucMuch(){
       FenetreFille fille;
       fille.exec(); // lance l'exécution de la fenêtre fille
    } // la fenetre fille est détruite ici, merci beaucoup
    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

  8. #8
    Membre actif
    Avatar de katanaenmousse
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 220
    Points : 232
    Points
    232
    Par défaut
    Bonsoir
    En fait je suis obligé d utiliser l allocation dynamique vu que ma fenêtre principale et son bouton permettent d ouvrir un nombre indéfini de fenêtres filles
    Et pour poursuivre ma fenêtre principale reste évidemment complètement fonctionnelle même avec plusieurs fenêtres filles ouvertes
    En tout cas comme je l ai indiqué le sujet est résolu et tout fonctionne
    Mais merci pour ta contribution tout de même :-)
    KatanaEnMousse
    Une fois qu'une réponse qui vous convient a été trouvée à votre sujet, pensez à le mettre en résolu.

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

Discussions similaires

  1. propriétés CSS dispo pour les widgets ?
    Par benibur dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 05/10/2010, 15h51
  2. Mémoire allouées par les dll.. où ?
    Par qdaemon_fr dans le forum Général Java
    Réponses: 0
    Dernier message: 19/05/2009, 11h03
  3. Réponses: 3
    Dernier message: 05/04/2007, 15h56
  4. Espace disque alloué pour les entiers
    Par stos dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/10/2006, 15h17

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