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 de remplacement de QIcon

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 285
    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 : 18 285
    Par défaut Gestion de la mémoire de remplacement de QIcon
    Bonjour,

    J'ai un icône dans un QPushButton, crée depuis un fichier png inclus dans les QRessources.

    de cet icône je récupère l'image dans un QImage, je modifie ensuite le QImage ( rempl de couleur ).

    Je crée un nouveau QIcon acec ce QImage et refait un setIcon.

    Pour éviter une fuite mémoire, je pense que je dois faire un delete sur mon ancien icône, qu'en pensez-vous ? Par ailleurs, le contenu de la ressource reste en mémoire je pense, donc il me restera en mémoire au moins la version des ressources. ( c'est un tout petit fichier - donc pas très grave, c'est juste par curiosité )

    Par ailleurs ceci m'amène une nouvelle question : comment fonctionne les ressources ? chargement en mémoire lors du chargement du fichier ? ou lors d'un 1er accès ? est-ce pareil sur windows, linux, et mac os x ? - cette question sors un peu du cadre de Qt mais bon.
    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

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Bonjour,

    J'ai un icône dans un QPushButton, crée depuis un fichier png inclus dans les QRessources.

    de cet icône je récupère l'image dans un QImage, je modifie ensuite le QImage ( rempl de couleur ).

    Je crée un nouveau QIcon acec ce QImage et refait un setIcon.

    Pour éviter une fuite mémoire, je pense que je dois faire un delete sur mon ancien icône, qu'en pensez-vous ?
    Je ne pense pas.

    Le principe de Qt est toujours de rendre le widget parent des éléments qu'on lui donne.

    Chaque fois que tu utilises une fonction setXXX ou addYYY qui prend un pointeur comme argument, l'élément au départ duquel tu invoques la fonction va automatiquement prendre la responsabilité de détruire l'objet pointé par le pointeur ( comprends : invoquer delete sur le pointeur au moment opportun).

    Il en va normalement de même lorsque tu invoque setIcon sur un bouton (ou n'importe quel widget)

    Au contraire, invoquer toi-même delete sur le pointeur vers ton icone a de très fortes chances de provoquer ce que l'on appelle une double tentative de libération de la mémoire :

    En invoquant delete sur ton pointeur, tu libères explicitement la mémoire allouée à ton icone, mais, en invoquant setIcon au départ de ton bouton, cela a pour résultat d'invoquer delete sur le pointeur vers l'icone qui est initialement utilisée par le bouton.

    Or, ce pointeur n'est rien d'autre que ... le pointeur sur lequel tu as déjà invoqué delete

    Le deuxième delete (celui qui sera effectué lors du setIcon) va essayer de libérer un espace mémoire qui a déjà été libéré on est en présence de ce que l'on appelle un comportement indéfini qui, dans le cas présent, résultera plus que vraisemblablement en une erreur de segmentation.
    Par ailleurs, le contenu de la ressource reste en mémoire je pense, donc il me restera en mémoire au moins la version des ressources. ( c'est un tout petit fichier - donc pas très grave, c'est juste par curiosité )

    Par ailleurs ceci m'amène une nouvelle question : comment fonctionne les ressources ? chargement en mémoire lors du chargement du fichier ? ou lors d'un 1er accès ? est-ce pareil sur windows, linux, et mac os x ? - cette question sors un peu du cadre de Qt mais bon.
    Je ne me suis jamais vraiment intéressé à la mécanique interne des fichiers de ressources.

    Mais, ce que je sais, c'est qu'ils ont pour résultat d'ajouter le contenu des fichiers indiqués directement au niveau du binaire de l'exécutable.

    On assiste peut être à un phénomène de compression à cette occasion (qui occasionne peut être une décompression quand le contenu du fichier indiqué comme ressource est utilisé)... ou non.

    Par contre, ce qui est sur, c'est que, si tu déclares une variable qui va spécifiquement charger le contenu du fichier fourni comme ressource (par exemple une nouvelle icone grâce à un QIcon * ptr = new QIcon("fichier.png"); ta variable ne va pas se contenter (à mon sens du moins) de faire pointer un quelconque pointeur interne vers le contenu du fichier qui se trouve dans l'exécutable: elle va réellement lire ce contenu.

    Et pour ce faire, elle aura recours à l'allocation dynamique de la mémoire afin de disposer de suffisamment d'espace pour représenter l'ensemble du contenu de la mémoire.

    Cela se fera évidemment à chaque fois que tu créeras une variable de type QIcon (pour reprendre l'exemple) et l'espace mémoire utilisé pour représenter (en interne, au niveau de ta variable QIcon) ne sera libéré que quand la variable sera réellement détruite.

    On peut donc se dire que si tu crées N variable de type QIcon qui utilisent le même fichier .png, tu utiliseras N fois l'espace mémoire nécessaire à la représentation en mémoire du contenu du fichier png en question et que la mémoire sera libérée au gré de la destruction des variables de type QIcon

    Je peux évidemment me tromper très lourdement, mais je ne crois pas que ce soit le cas pour la simple et bonne raison qu'il est tout à fait possible de charger des icones qui ne sont pas forcément reprises dans le fichier rc
    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

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 285
    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 : 18 285
    Par défaut
    Merci pour ta réponse Koala.

    Il y avait 2 solutions possibles :
    - perte du pointeur sur l'ancien objet, l'objet restant en mémoire mais inaccessible, si l'on veut "garder" l'ancienne version, il faut en avoir une copie, et non pas son pointeur
    - destruction de l'ancien objet lors du remplacement de celui-ci, impossible donc de garder l'ancienne version.

    Je connais donc maintenant le comportement par défaut. Si celui-ci ne me convient pas, il me suffit de dériver l'objet.
    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

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

Discussions similaires

  1. Gestion de mémoire et remplacement de pages
    Par da_latifa dans le forum C
    Réponses: 4
    Dernier message: 28/11/2014, 20h08
  2. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  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