Partage
  • Partager sur Facebook
  • Partager sur Twitter

fuite de mémoire

Sujet résolu
    13 juin 2006 à 17:21:40

    bonjour,

    Mon problème vient du fait que lorsque mon programme tourne, si je bouge la souris ne serait-ce que d'un pixel, la mémoire utilisée augmente.
    J'ai regardé dans le main et dans les fonctions si j'avais bien mis tous les SDL_FreeSurface et il n'en manque aucun.
    Est-ce que les fuites de mémoires peuvent avoir d'autres origines que l'oubli de SDL_FreeSurface ?

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2006 à 17:24:18

      Oui, n'importe quel malloc() sans free().
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2006 à 17:27:23

        et si je n'ai mis aucun malloc ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2006 à 17:57:02

          Un calloc aussi prend de la mémoire. Tu utilises peut-être une fonction qui utilise un malloc/calloc sans que tu ne le saches, ou que tu as oublié.
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2006 à 18:25:42

            Comme beaucoup de fonctions SDL. Beaucoup de choses peuvent provoquer des fuites de mémoire.
            • Partager sur Facebook
            • Partager sur Twitter
              13 juin 2006 à 18:34:26

              Oui, mais :
              SDL_Quit();
              Ferme toutes les fonctions initialisées avec la SDL


              ET pour chaque fonction que tu utilise, il y a une "fermeture" du moins des fonctions correctement codées :-°

              Sauf que tu ne la "voit" pas toujours ^^

              Donc c'est très probable que il y ai une mauvaise ou un oubli de fermeture...



              ++ PianoPâriss
              • Partager sur Facebook
              • Partager sur Twitter
                13 juin 2006 à 18:46:12

                Qu'est-ce que tu racontes ?
                SDL_Quit() arrête simplement la lib, en désallouant ce qu'elle a allouée elle-même. Je ne suis pas sûr que cela remplace les SDL_FreeSurface() qu'il pourrait rester (je pense même que non).

                Citation : PianoPariss

                ET pour chaque fonction que tu utilise, il y a une "fermeture" du moins des fonctions correctement codées


                Merci d'être plus explicite, on capte rien de la fin de ton post là...
                • Partager sur Facebook
                • Partager sur Twitter
                  13 juin 2006 à 18:48:07

                  Oui, c'est ce que je dis :

                  SDL_Quit(); désalloue ce que la SDL à alloué !

                  Et je dis que chaque allouage à besoin d'un désallouage
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2006 à 20:06:46

                    Voici une des fonctions qui fait que la mémoire augmente indéfiniment. Impossible de voir ou se situe la fuite de mémoire car dans cette fonction il n'y a qu'un SDL_Surface et donc un seul SDL_FreeSurface.


                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <SDL/SDL.h>
                    #include <SDL/SDL_image.h>
                    #include "aliment.h"

                    void afficher_aliment(SDL_Surface *ecran, int ali[NB_COLONNE][NB_ALIMENT], int niv)
                    {
                        SDL_Rect positionAliment;
                        SDL_Surface *aliment = NULL;
                        int i = 0;

                        for(i=niv; i<=niv + NB_A_DETERMINER; i++)
                        {
                            positionAliment.x = 550;

                            if (ali[CHOIX][i] == PAS_FAIT)
                            {
                                switch (i)
                                {
                                    case 0:
                                        aliment = IMG_Load("photo/laitue.bmp");
                                        SDL_SetColorKey(aliment, SDL_SRCCOLORKEY, SDL_MapRGB(aliment->format, 0, 0, 255));
                                        positionAliment.y = 76 + 100 * (i - niv);
                                    break;

                                    case 1:
                                        aliment = IMG_Load("photo/epinard.bmp");
                                        SDL_SetColorKey(aliment, SDL_SRCCOLORKEY, SDL_MapRGB(aliment->format, 0, 0, 255));
                                        positionAliment.y = 76 + 100 * (i - niv);
                                    break;
                                }
                            }
                            SDL_BlitSurface(aliment, NULL, ecran, &positionAliment);
                        }
                    SDL_FreeSurface(aliment);

                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2006 à 20:12:17

                      c'est simple, il faut faire un SDL_FreeSurface() avant d'appeler IMG_Load() sinon la surface chargée reste en mémoire. Tandis que le pointeur pointe autre part.

                      ps : mets le SDL_FreeSurface() juste avant le } du for()
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2006 à 20:21:31

                        Je vais surement poser une question toute bête mais si je mets le SDL_FreeSurface dans le for, à la fin du premier passage la surface en question va être libérée et donc au deuxième passage comment le IMG_Load peut-il encore fonctionner vu que la surface n'est plus en mémoire ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 juin 2006 à 20:23:50

                          tu n'as pas (bien) compris le chapitre sur les pointeurs :)
                          IMG_Load() renvoit la référence vers l'image chargée en mémoire et la mets dans le pointeur.

                          edit : SDL_FreeSurface() détruit ce vers quoi pointe le pointeur et non le pointeur lui même.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 juin 2006 à 20:39:14

                            Charger des images à chaque boucle, c'est un peu débile !
                            Charge-les en début de programme, et choisi à chaque fois laquelle afficher...
                            • Partager sur Facebook
                            • Partager sur Twitter

                            fuite de mémoire

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown