Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec la libération de mémoire

dans le destructeur d'une classe

Sujet résolu
    15 mars 2008 à 13:56:21

    Bonjour tout le monde ! :)

    Voilà le problème : dans une classe, j'ai deux attributs Rho et Theta dans une structure Param. J'ai aussi un pointeur de int ** pour allouer un tableau bi-dimensionnel. Dans une méthode, j'alloue ce tableau avec une taille [Rho][Theta] et dans le destructeur de ma classe, je libère la mémoire. A la compilation, aucune erreur, aucun warning, mon programme fonctionne bien mais lorsque je le quitte, j'ai le message d'erreur suivant o_O : Image utilisateurEt lorsque je met le destructeur en commentaire (pour ne pas qu'il fasse partie du code) il n'y a pas le message ! :euh:

    Voiçi le code :
    Classe :
    1. class classe
    2. {
    3.     public :
    4.     classe(void);
    5.     void allouer (void);
    6.     ~classe (void);
    7.     private :
    8.     struct Param
    9.     {
    10.         int Rho;
    11.         int Theta;
    12.     };
    13.     int ** tab;
    14. };

    Méthode :
    1. void classe::allouer (void)
    2. {
    3.     Param param;
    4.     param.Rho = (int) (sqrt (pow (img->w, 2) + pow (img->h, 2)));
    5.     param.Theta = (int) (2 * 3.1416 / atan2 (1, max (img->h, img->w)));
    6.     tab = new int* [param.Theta];
    7.     if (tab == NULL)    exit (EXIT_FAILURE);
    8.     for (int i = 0 ; i < param.Theta ; i++)
    9.     {
    10.         tab [i] = new int [param.Rho];
    11.         if (tab [i] == NULL)    exit (EXIT_FAILURE);
    12.     }
    13. }

    Destructeur :
    1. Hough::~Hough (void)
    2. {
    3.     Param param;
    4.     for (int i = 0 ; i < param.Theta ; i++)    delete [] tab[i];
    5.     delete [] tab;
    6. }

    Voilà j'espère que vous pourrez m'aider à trouver l'origine de l'erreur ! :p

    Merci d'avance ! ;)
    • Partager sur Facebook
    • Partager sur Twitter
      15 mars 2008 à 16:12:48

      Salut

      Juste par hasard, peut être que param.Theta est modifié au cours du code, ou mal passé ou autre ? Ce qui ferait que tu tenterais de supprimer plus de mémoire que tu n'en a alloué par exemple ...

      Peut être aussi que tu as des instances de classe pour lesquelles tu n'appelles pas la méthode allouer (et dans ce cas tu tentes de libérer de la mémoire nulle) ... est-ce que tu appelles la méthode allouer dans le constructeur ?

      • Partager sur Facebook
      • Partager sur Twitter
        15 mars 2008 à 16:56:13

        Salut, merci de me répondre ! ;)

        Je ne modifie pas Rho et Theta dans le code, j'appelle la méthode allouer pour tous les objets crées mais je ne l'appelle pas dans le constructeur. :)
        Autres précisions : je suis sous windows XP et j'utilise Dev-C++ (et son débeugger n'indique aucun problème). ^^

        J'espère que ces précisions pourront vous aider ! :D
        • Partager sur Facebook
        • Partager sur Twitter
          15 mars 2008 à 18:08:20

          A tous les coups tu copies ta classe alors qu'elle n'a pas été blindée pour supporter la copie.
          => Regarde le tuto de matthéo sur la copie, et étend-le également aux affectations.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            15 mars 2008 à 18:28:58

            Non je ne copie pas ma classe ! Perdu ! :p

            Voilà un zip du code complet pour vous aider : ici. ;)

            La classe en question est dans hough.h et hough.cpp et la méthode qui alloue la mémoire est CréerAccumulateur (). ^^

            Le zip est dans la dernière réponse. Le sujet n'a rien à voir, c'est juste pour mettre le zip. :D
            • Partager sur Facebook
            • Partager sur Twitter
              15 mars 2008 à 20:39:22

              Je crois avoir trouvé.
              Lorsque tu crées une inner-class (classe imbriquée), tu changes simplement le scope de cette classe, ni plus ni moins.
              Donc ici, dans CreerAccu(), tu fais joujou avec une variable param qui est détruite à la fin de cette méthode.
              Ensuite, dans le destructeur, tu recrées une variable param radicalement différente de celle de CreerAccu() !
              Mets donc cette structure param en tant qu'attribut et ca sera tout bon.
              Et donc, tu peux faire sauter ta structure et ne garder que Rho et Theta.
              • Partager sur Facebook
              • Partager sur Twitter
                15 mars 2008 à 21:25:36

                En effet, c'était bien cela le problème ! Bien joué ! lol :p

                Merci beaucoup de votre aide ! :ange:
                • Partager sur Facebook
                • Partager sur Twitter

                Problème avec la libération 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