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 :

Libération de la mémoire

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 258
    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 258
    Par défaut Libération de la mémoire
    Bonjour,

    J'ai un doute sur la méthode de libération mémoire d'objets.

    Dans 1 fonction, je transforme une image de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void fonction()
    {
      QImage img=label->pixmap()->toImage();
      ....
      traitement
      ....
      label->setPixmap(QPixmap::fromImage(img));
    }
    A la fin de ma fonction, normalement ma variable img est détruite.

    Si je teste le code ci-dessous, cela ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void fonction()
    {
    QImage *img;
     
      img=new QImage();
      img=label->pixmap()->toImage();
      ....
      traitement
      ....
      label->setPixmap(QPixmap::fromImage(img));
     delete img;
    }
    Pardonnez mes doutes,mes amalgames, mes confusions , je suis pas programmeur professionnel.

    Sur ce point la gestion mémoire est importante, car le QImage peut contenir une valeur importante de donnés, donc si j’appelle plusieurs fois la fonction ....

    D'après les tests effectués, l'espace mémoire occupé par l'application augmente lors du 1er appel à la fonction, ne diminue pas, mais n'augmente pas lors du second appel à la fonction.
    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
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Il faut regarder la doc, toImage renvoie un objet et pas un pointeur. Donc on ne peut pas faire QImage *img = label->pixmap()->toImage(); car les types sont différents.

    Le premier code est bon. La variable img sera détruite mais ça n'est pas un problème, elle ne détruira pas l'objet QPixmap passé en argument que tu crées ici QPixmap::fromImage(img).

    En général il est beaucoup plus simple et aussi efficace de laisser le langage gérer ces optimisations, tant que l'on sait ce qu'on fait. En l'occurrence Qt pratique le implicit data sharing et il évitera quand c'est possible de recopier des données tant qu'elles n'ont pas besoin d'être modifiées.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    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 258
    Par défaut ok
    Merci Ymoreau,

    J'avais bien compris qu'un objet était retourné par toImage. Mon soucis c'est que moi je n’appelle pas de destructeur. Je présumes donc que le destructeur est automatiquement appelé lors de la fin de ma fonction. Mais je suis pas sûr de moi.

    Ma RAM n'est augmenté qu'au 1er appel de ma fonction, je pense que mon tas est augmenté pour faire tenir mon QImage.

    Merci pour la réponse.
    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

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    En effet le destructeur est toujours appelé quand un objet est "détruit", cad explicitement avec un delete s'il a été alloué avec un new, ou implicitement comme ici à la fin du bloc qui déclare la variable.

  5. #5
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Je te suggère aussi la lecture de la FAQ Qt, notamment la section qui traite des spécifités de Qt relatives au modèle QObject : http://qt.developpez.com/faq/?page=g...eobjet-qobject

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

Discussions similaires

  1. Libération de la mémoire
    Par Premium dans le forum C
    Réponses: 4
    Dernier message: 09/08/2006, 18h15
  2. [CSV] Libération de la mémoire
    Par cedricgirard dans le forum Langage
    Réponses: 7
    Dernier message: 05/01/2006, 12h02
  3. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29
  4. [VB]Libération de la mémoire
    Par seroa dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/10/2005, 11h52
  5. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02

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