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 :

Gestion de la mémoire avec Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut Gestion de la mémoire avec Qt
    Salut tout le monde,

    je me tourne vers vous pour essayer de comprendre quelque chose concernant la gestion de la mémoire avec Qt.

    J'ai vu cet exemple sur le forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void showMessage()
    {
        QDialog dialog;
        QVBoxLayout *layout = new QVBoxLayout(&dialog);
        QLabel *message = new QLabel("Cliquez sur le bouton");
        layout->addWidget(message);
        QButton *button = new QButton("Cliquez ici");
        layout->addWidget(button);
        dialog.exec();
    }
    http://qt.developpez.com/faq/?page=generalites-memoire

    Il est dit que ce code fonctionne et c'est juste mais quand on regarde dans le gestionnaire de tâche on voit que toute la mémoire c'est pas libéré !

    J'aimerais bien comprendre pourquoi ? Et comment faire pour récupérer cette mémoire ?

    Merci d'avance

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    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 : 17 453
    Points : 43 118
    Points
    43 118
    Par défaut occupation mémoire
    Je ne pense pas que la RAM soit libérée car ton QDialog n'est pas détruit. Il appartient à ta QApplication et sera détruite automatiquement à la fin de ta QPApplication.

    un delete dessus devrait libérer sa RAM ( du QDialog ) et celle de ses enfants.

    Après je suis débutant, donc ce que je dis est à prendre avec précautions.
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Mais on ne peut pas faire de delete puisque le QDialog n'est pas déclaré avec new ! non ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Oui, pour le delete de dialog, il ne faut pas le mettre.
    exec() est une fonction bloquante, donc ton dialogue sera affiché jusqu'à temps que l'utilisateur le valide ou l'annule. Donc l'exécution du programme ne sort pas de la fonction tant que le dialogue est ouvert : tout va bien.
    dialog est un variable locale sur la pile, elle sera détruite à la fin de la fonction (comportement normal des variables locales en C++).
    Le QLayout, le QButton et le QLabel sont créé dynamiquement avec new et sont attachés entre eux : lors de la destruction de QLayout, le QButton et le QLabel seront détruit (système de destruction des hiérarchies d'objets de Qt).
    Par contre, ton QLayout n'est pas lié à un autre objet Qt, n'est pas local (donc pas détruit à la fin de la fonction) et n'est pas détruit par delete. Tu as donc bien une fuite mémoire (en plus du fait que ces objets ne servent à rien actuellement)
    J'imagine que tu voulais mettre ton QLayout dans ton dialog ? Si tu fais cela, le QDialog détruira les autres objets Qt. Si ce n'est pas ce que tu veux faire, il vaut voir ce que tu veut faire de ton QLayout

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Le fait de créer le layout en lui indiquant que son parent est dialog par une référence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVBoxLayout *layout = new QVBoxLayout(&dialog);
    ne le lie pas à la fenêtre dialog ?

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Si, j'avais pas vu
    Cela permet de mettre le QLayout comme enfant et donc de le détruire automatiquement
    (par contre, cela ne permet pas de mettre le layout dans le dialogue, il faudrait utiliser setLayout)
    Donc il devrait pas y avoir de fuite mémoire

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Points : 50
    Points
    50
    Par défaut
    Bah ouais je ne comprends pas trop ce qu'il se passe

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    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 : 17 453
    Points : 43 118
    Points
    43 118
    Par défaut allocation RAM
    Je présumes que la RAM ayant été allouée est prise dans le tas. Le peut être étendu mais ne rapetisse pas, par contre la RAM n'étant plus utilisée est dispo pour ton processus. Il y a peut-être 1 fonction pour le réduire le tas. ( je parle de fonction système, hors Qt )
    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

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut
    Citation Envoyé par kipgon Voir le message
    Le fait de créer le layout en lui indiquant que son parent est dialog par une référence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QVBoxLayout *layout = new QVBoxLayout(&dialog);
    Attention, tu ne lui indique pas dialog par référence, mais par pointeur!

    En fait, le & de &dialog est l'opérateur "address of" (ou si tu préfères, l'opérateur "prend l'adresse de") qui permet d'obtenir... un pointeur vers l'objet en question, ce qui est, justement, attendu par le constructeur de QVBoxLayout (tout comme la plupart des constructeur des composants visuels, d'ailleurs, qui attendent un pointeur sur le composant visuel "propriétaire" )
    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

  10. #10
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    (par contre, cela ne permet pas de mettre le layout dans le dialogue, il faudrait utiliser setLayout)
    Sisi, cf le code de Qt (qlayout.cpp) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QLayout::QLayout(QWidget *parent)
        : QObject(*new QLayoutPrivate, parent)
    {
        if (!parent)
            return;
        parent->setLayout(this);
    }

  11. #11
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ok, si je dis autant de bêtises en aussi peu de messages, ça va plus...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/10/2010, 10h21
  2. Comment faire la gestion de mémoire avec WMI
    Par gharras dans le forum C#
    Réponses: 2
    Dernier message: 30/11/2009, 11h56
  3. Gestion de la mémoire avec RMS
    Par bpmfoukamoko dans le forum Développement Mobile en Java
    Réponses: 3
    Dernier message: 12/09/2008, 22h14
  4. Gestion de la mémoire avec Firefox
    Par NeqO55 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/09/2007, 13h26
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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