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 :

Gestion de la mémoire par Qt


Sujet :

Qt

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : mars 2009
    Messages : 312
    Points : 174
    Points
    174
    Par défaut Gestion de la mémoire par Qt
    Bonjour.

    J'aurai juste voulu savoir comment Qt gérait la mémoire.

    Est-ce que par exemple lorsque que le destructeur d'un Widget1 est appelé, tous les destructeurs des Widgets enfants (c'est à dire les widgets qui on été créé avec comme parent Widget1) sont automatiquement appelés ?

    De même, que se passe-t-il lors de la destruction d'un Widget contient un Layout, lui-même rempli de Widgets ?

    En gros, est-ce que Qt s'occupe de "tout" pour qu'il n'y ait pas de fuite de mémoire lorsque la déclaration parent/enfant est bien faite ?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967

  3. #3
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Je relance ce topic car je me pose également des questions sur la bonne destruction des éléments alloués.

    Je n'avais pas mis en priorité, le codage des destructeurs.
    Je m'y penche à présent.

    J'ai fait souvent dans certaines classes, des QTableWidget, contenant eux-même des éléments d'interface de saisie dynamiques.

    Donc je fais un balayage des QTableWidget, pour détruire ces éléments.
    Je détruis des propriétés de classe de type tableau, membre de ma classe aussi.

    Et je laisse à la fin le "delete ui" généré automatiquement.
    Mais est-ce suffisant ?
    Tous les élements crée via qt designer avec le GUI, sont détruits implicitement après le "delete ui" ?


    Merci d'avance pour vos éclaircissements.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Tu peux monter à quoi ressemble une classe typique pour toi?

  5. #5
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Bonjour Yan,

    tu veux que je te montre le prototype d'une classe ?
    L'initialisation d'un de mes QTableWidget ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Citation Envoyé par gui80 Voir le message
    Bonjour Yan,

    tu veux que je te montre le prototype d'une classe ?
    L'initialisation d'un de mes QTableWidget ?
    un prototype. Pour bien comprendre ce que tu désallou et pourquoi.

  7. #7
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Voici celui d'une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class interface_fiche3a : public QScrollArea
    {
        Q_OBJECT
     
    public:
        explicit interface_fiche3a(QWidget *parent = 0);
        ~interface_fiche3a();
        QString TitreGraphique();
        QList <float> ValeursGraphique();
        QList <QString> LibellesLegendeGraphique();
     
        Ui::interface_fiche3a *ui;
        int **TAB_reponses_questions_note;
        int nbLignes;
        int indiceColonneNote;
    public slots:
        void SlotQuestionN(int index);
    private:
        void Init();
        void setNote(int indice,int index);
        void CalculTotal();
     
        QString titreGraphique;
        QList <QString> libellesLegendeGraphique;
    };

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Et peux tu donner le destructeur?

  9. #9
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Le voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    interface_fiche3a::~interface_fiche3a()
    {
        int i,j;
        int nbLignes = this->ui->uneTableWidget->rowCount();
     
        for(i = 0  ;  i < nbLignes  ;  i++)
            for(j = 0  ;  j < 4  ;  j++)
                delete(this->ui->uneTableWidget->cellWidget(i,j));
     
     
        this->libellesLegendeGraphique.clear();
     
        for(i = 0  ;  i < this->nbLignes  ;  i++)
            delete(this->TAB_reponses_questions_note[i]);
     
        delete(this->TAB_reponses_questions_note);
     
     
        delete ui;
    }

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    inutile, Qt s'en charge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        int nbLignes = this->ui->uneTableWidget->rowCount();
     
        for(i = 0  ;  i < nbLignes  ;  i++)
            for(j = 0  ;  j < 4  ;  j++)
                delete(this->ui->uneTableWidget->cellWidget(i,j));
    inutile, Qt s'en charge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->libellesLegendeGraphique.clear();
    Pourquoi faire un pointeur de pointeur
    un vecteur ou au pire un vecteur de vecteur serait bien mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0  ;  i < this->nbLignes  ;  i++)
            delete(this->TAB_reponses_questions_note[i]);
     
        delete(this->TAB_reponses_questions_note);
    pourquoi un pointeur ?

    Donc en gros tu peux eviter de coder un constructeur . Tous ce qui est ui sera détruit automatiquement par la relation parent.enfant entre les QObject.

  11. #11
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Bien noté pour tes deux 1ères remarques, merci.

    Pour la 3ème :
    je voulais quelque chose de très clair, qui s'initialise au même endroit, ce que j'ai pu faire avec un tableau avec une notation JSON comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
    {1,2,3,-1},
    {0,2,3,-1},
    {1,2,-1,-1},
    {0,2,4,-1}
    }
    Pour la 4ème remarque, je ne comprends pas bien ta question, car le "delete ui" est instruction qui a généré automatiquement dans le destructeur, au moment de la création de ma classe d'interface graphique.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Pour la 4ème remarque, je ne comprends pas bien ta question, car le "delete ui" est instruction qui a généré automatiquement dans le destructeur, au moment de la création de ma classe d'interface graphique.
    C'est Qt qui génère cela?

  13. #13
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    Oui, il le génère automatiquement.

    Dans Qt Creator, j'ai ajouté une classe, j'ai choisi dans l'assistant "Classe d'interface graphique Qt Designer".

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Citation Envoyé par gui80 Voir le message
    Oui, il le génère automatiquement.

    Dans Qt Creator, j'ai ajouté une classe, j'ai choisi dans l'assistant "Classe d'interface graphique Qt Designer".
    Ok. En soit même cela ne sert pas à grand chose. Mais bon. Je vais pas les contredire

  15. #15
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    c'est pas moi, c'est Qt le méchant qui a fait çà !


    Donc sinon, y a rien d'autre à détruire ?
    Il ne faut pas que je m'arrête en si bonne voie de destruction.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    mars 2004
    Messages
    10 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2004
    Messages : 10 031
    Points : 13 967
    Points
    13 967
    Par défaut
    Citation Envoyé par gui80 Voir le message
    Donc sinon, y a rien d'autre à détruire ?
    Il ne faut pas que je m'arrête en si bonne voie de destruction.
    A par le ui, je ne voie pas.


    Après, C++ fournie assez d'outil(std::vector, smart pointer, ...) pour que la mémoire se gère toute seule.

  17. #17
    Membre actif
    Inscrit en
    mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 290
    Points : 214
    Points
    214
    Par défaut
    il n'y a rien à détruire en fin de compte alors.

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/05/2012, 10h21
  2. Réponses: 2
    Dernier message: 12/09/2010, 21h29
  3. Gestion de la mémoire par la VM
    Par sloshy dans le forum Général Python
    Réponses: 3
    Dernier message: 13/09/2009, 04h14
  4. Gestion de la mémoire par jonas
    Par DevServlet dans le forum JOnAS
    Réponses: 2
    Dernier message: 13/01/2009, 19h01
  5. Réponses: 15
    Dernier message: 14/11/2007, 12h54

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