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 :

[Qt] Recherche Doc de gestion mémoire


Sujet :

Qt

  1. #1
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut [Qt] Recherche Doc de gestion mémoire
    Bonjour,

    Je programme une application avec Qt et je me pose beacoup de question sur la gestion mémoire.

    En effet il parait que si on declare un widget avec un new, il est automatiquement détruit par le QApplication. Jusque la pas de souci. Ce qui m'intrigue c'est surtout que si on créer un widget de manière classique et que l'on passe une référence au lieux d'un pointeur ca marche encore.

    D'ou la question : comment il fait pour savoir ce qu'il à le droit de détruire ?

    Mon probleme est le suivant : Je créer des classes qui contiennent des widgets. je les ajoute à mon application et quand l'objet est détruit il enlève le Widget de l'application et fait un delete. Ensuite pour une raison obscure Qt plante (je pense qu'il tente toujours d'acceder à mon objet). Comment gérer mes widgets dans ces conditions ??? Il existe pas un smartpointeur spécial Qt qui gère ca ?

    Est ce que quelqu'un peut m'aider ?

    Merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Attention, QApplication ne détruit rien !
    Lorsque le père d'une hiérarchie de QObject est détruit, automatiquement ses enfants sont tous détruits, donc si on passe un pointeut vers un fils alloué sur la pile, ça va planter tôt ou tard.

    Si tu voulais nous montrer un exemple exact de ce que tu penses, ça nous aiderait à comprendre aussi

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par Higestromm
    En effet il parait que si on declare un widget avec un new, il est automatiquement détruit par le QApplication. Jusque la pas de souci. Ce qui m'intrigue c'est surtout que si on créer un widget de manière classique et que l'on passe une référence au lieux d'un pointeur ca marche encore.
    En réalité c'est un pointeur qui est passé, ça ne pourrait pas marcher avec une référence. Pour clarifier les idées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QWidget w;
    QWidget *p = &w; // &w est un pointeur, pas une référence
    Citation Envoyé par Higestromm
    D'ou la question : comment il fait pour savoir ce qu'il à le droit de détruire ?
    Voir la doc :
    When you create a QObject with another object as parent, it's added to the parent's children() list, and is deleted when the parent is.
    C'est aussi simple que ça.

    Citation Envoyé par Higestromm
    Mon probleme est le suivant : Je créer des classes qui contiennent des widgets. je les ajoute à mon application et quand l'objet est détruit il enlève le Widget de l'application et fait un delete. Ensuite pour une raison obscure Qt plante (je pense qu'il tente toujours d'acceder à mon objet). Comment gérer mes widgets dans ces conditions ??? Il existe pas un smartpointeur spécial Qt qui gère ca ?
    Il faudrait voir le code (un exemple minimal SVP). Comme ça, je ne peux que supposer qu'un objet est crée sur la pile au lieu d'être créé sur le tas, tout en étant un « enfant » d'un autre objet.

  4. #4
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    bah un exemple de tete donc m'en voulez pas si la syntaxe est pas tout a fait la bonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class truc : public QWidget
    {
      public :
      truc(QWidget *parent, const char *name) : QWidget(parent, name)
      {
        QPushButton bouton("test", this);
      }
    };
    Dans le cas présent on créer un QPushbutton qui est ajouter à la liste des fils du widget. Ceci dit la variable bouton a une portée limitée au constructeur et sera donc détruit après. Pourtant l'application ne plante pas, j'en conclus qu'une copie est faite, mais dans ce cas si j'aurais fait un new j'aurais eu une fuite mémoire non ?

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En fait, là, ton objet est créé, mais il est détruit à la fin du constructeur, et il est automatiquement aussi retiré de la liste de son père, donc il n'y a pas de delete, pas de copie, rien.
    Et s'il est encore affiché, c'est peut-être qu'un update n'est pas réalisé par la suite, mais là encore, l'as-tu fait fonctionner, ce bouton ?

  6. #6
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    En effet j'ai fait le test et il n'est pas afficher... curieux j'avais le souvenir que mes premières applications ressemblaient à ca ...

    Donc si je comprend bien, si j'enlève un widget de son arbre, il ne sera pas détruit par Qt ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Higestromm
    Donc si je comprend bien, si j'enlève un widget de son arbre, il ne sera pas détruit par Qt ?
    Exact. Pour ce faire, il suffit de faire un setParent(NULL).

  8. #8
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Bon bah tout ca m'as bien éclairci les idées Merci !

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

Discussions similaires

  1. recherche doc interbase en francais
    Par dagon dans le forum InterBase
    Réponses: 2
    Dernier message: 24/08/2005, 21h49
  2. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 21h11
  3. recherche DOC
    Par vorador dans le forum ASP
    Réponses: 2
    Dernier message: 09/09/2004, 14h12
  4. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34
  5. recherche doc sur les courbe de bézier
    Par amaury pouly dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/04/2003, 22h41

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