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 :

Problème de libération de la mémoire dans une fonction

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut Problème de libération de la mémoire dans une fonction
    Bonjour,

    J'ai créé une fonction qui agrandit une image donnée. Cette image est une QImage passée en paramètre. La fonction renvoie l'image agrandit.

    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
     
    QImage MaClasse::agrandissement(QImage *img, int iCoeff)
    {
        // Initialisation de Col et Lig
        int Col = ...;
        int Lig = ...;
        QImage imgTmp = QImage (QSize(Col,Lig), img->format());
        for (l : 0->Lig)
        {
            for (c : 0->Col)
            {
                QRgb ValeurCalculee = ...;
                imgTmp.setpixel(c,l, ValCalculée);
            }
        }
        return imgTmp;
    }
    Ce que je souhaite, c'est libérer la place mémoire utilisée pour créer l'image agrandie. Or ca ne se passe pas comme ca. A chaque fois que je passe dans la fonction, "setpixel()" fait augmenter la mémoire allouée au programme (je ne savais pas pourquoi, mais j'ai remarqué que "QImage ()" ne réservait pas la place entière pour l'image); Après tout, le programme peut réserver la mémoire comme ca lui chante.
    MAIS le problème, c'est que cette place n'est pas libéré à la sortie de la fonction (je trouve ca bizarre). Comment est-ce possible? Que dois-je faire pour libérer la place ?

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Le problème ne se pose sans doute pas à ce niveau, vu qu'avec une manipulation de variables, il y a destruction automatique (cf la durée de vie). D'où provient le QImage *img passé en paramètre ? N'est-ce pas celui-ci qui est à l'origine de la fuite de mémoire s'il est remplacé au scope d'au-dessus par la nouvelle image ?

    Notez que vous avez à votre disposition la fonction scaled() pour effectuer un changement de taille de QImage.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut
    Citation Envoyé par Amnell
    D'où provient le QImage *img passé en paramètre ?
    Dans le paramètre "QImage *img", j'y place une image issue d'un vector de QImage*.

    Citation Envoyé par Amnell
    N'est-ce pas celui-ci qui est à l'origine de la fuite de mémoire s'il est remplacé au scope d'au-dessus par la nouvelle image ?
    Pourquoi y aurait il une copie d'image. Juste une adresse, non ?

    Citation Envoyé par Amnell
    la fonction scaled()
    Je ne crois pas que cette fonction modifie l'image. Après, Je tiens à la modifier moi-même.

    Et quand je dis fuite mémoire, c'est à chaque itération de la fonction setPixel() à coup de 4 octets. (Autant que pour l'allocation de la place avec le constructeur QImage()). Donc, au final, c'est des méga entier...

Discussions similaires

  1. Problème avec if .. else if.. else dans une fonction
    Par marwa21 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 21/04/2011, 10h37
  2. Fuite mémoire dans une fonction
    Par medkyl dans le forum Débuter
    Réponses: 7
    Dernier message: 30/12/2009, 16h19
  3. Réponses: 3
    Dernier message: 07/05/2008, 13h30
  4. Réponses: 10
    Dernier message: 08/12/2007, 11h10
  5. Réponses: 6
    Dernier message: 30/10/2007, 12h27

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