Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme : Fonction - Libération de mémoire.

Sujet résolu
    10 juin 2007 à 16:02:19

    Bonjour,
    J'ai un problème avec cette fonction :
    int** Map::getEventGrille(Monstre *monstre,int hauteur, int largeur)
    {
            int **eventGrille2;

            eventGrille2=new int*[hauteur];
            for(int i=0;i<hauteur;i++)
            {
                    eventGrille2[i]=new int[largeur];
                    for(int j=0;j<largeur;j++)
                            eventGrille2[i][j]=_eventGrille[i][j];
            }


            for(int i=0;i<_nombreMonstre;i++)
            {
                    eventGrille2[monstre[i].getPositionCaseY()+1][monstre[i].getPositionCaseX()]=1;
                    eventGrille2[monstre[i].getPositionCaseY()][monstre[i].getPositionCaseX()]=1;
            }

            return eventGrille2;

            for(int i=0;i<hauteur;i++)
                    delete eventGrille2[i];
            delete eventGrille2;
    }


    J'aimerais qu'il libere la mémoire avant la fin de la fonction, mais je ne sais pas comment faire.
    Si vous le savez, merci de me dire comment faire.
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2007 à 16:20:55

      Tu ne peux pas. Et sache que là ta mémoire n'est pas libérée puisque la fonction est quittée lors du return.

      Donc soit tu ne fais que l'allocation dans cette fonction et la libération dans une autre (sans oublier d'appeller les 2...)

      Soit tu fais le traitement que tu as à faire dans cette fonction.
      • Partager sur Facebook
      • Partager sur Twitter
        10 juin 2007 à 16:22:20

        La mémoire allouée pour les variables temporaires est automatiquement libérée à la fin de la fonction ;) .
        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2007 à 17:04:20

          Pourtant, quand je ne fais pas appelle a mon fonction, tout va bien, si j'y fais appelle et que je regarde la mémoire vive utilisée, elle augmente tout le temps de plusieurs dizaines de mo à la seconde!
          • Partager sur Facebook
          • Partager sur Twitter
            10 juin 2007 à 17:12:36

            Quand on alloue un tableau, il faut utiliser delete[] et non pas delete pour libérer la mémoire.

            Par ailleurs, ce serait plus simple d'utiliser std::vector, pour éviter ce genre de problème, surtout qu'ici ton code ne résiste pas aux exceptions... (pas exception-safe).
            • Partager sur Facebook
            • Partager sur Twitter
              10 juin 2007 à 17:34:16

              std::vector, excuse moi, mais à quoi ça sert?
              • Partager sur Facebook
              • Partager sur Twitter
                10 juin 2007 à 17:42:18

                Oublie ce que viens de dire monsieur en attendant que Mathéo parle des modèles et de la STL :-° ...
                A mon avis c'est normal que cela prenne autant de place car regarde quel gros tableau tu crées. :lol: ...
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juin 2007 à 17:43:48

                  Il ne fait que 400 X 600 :D
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juin 2007 à 17:56:49

                    Oulah, en plus j'ai même pas vu qu'il y avait le return avant les delete !

                    Oui la mémoire tu dois la libérer en dehors de la fonction comme a dit Antartika.

                    Et sinon, tu n'es pas obligé d'attendre que Mateo21 parle de la STL, Mateo n'a pas beaucoup de temps.

                    Le type de base C++ pour les tableaux dynamiques, c'est std::vector. (tu connais bien std::string, pour les chaînes de caractères ?)

                    Ce lien te sera très utile pour apprendre le minimum nécessaire pour se débrouiller.

                    http://c.developpez.com/faq/cpp/?page=STL
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juin 2007 à 18:20:51

                      Je fais comment pour libérer la mémoire en dehors de la fonction?
                      Si je suis en dehors de la fonction, je n'ai pas accès à ma variable.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 juin 2007 à 18:56:54

                        Si, parce que tu auras récupéré le pointeur en valeur de retour, et parce que tu connais les dimensions de ton tableau.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juin 2007 à 19:23:19

                          Si je te montres comment je fais appelle a ma fonction, tu saurais me monstrer comment faire?

                          hero.setChemin(positionSouris,map.getEventGrille(monstre,map.getHauteur()*2,map.getLargeur()*4));
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2007 à 20:11:54

                            faut mettre les "delete" ailleurs

                            edit : j'avais pas vu que c'était la même variable
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juin 2007 à 21:28:11

                              Non non pas de delete avant le return sinon ton résultat est inexploitable (seg fault probable)

                              Donc ce que tu peux faire:


                              eventgrille = map.getEventGrille(monstre,map.getHauteur()*2;
                              hero.setChemin(positionSouris,eventgrille,map.getLargeur()*4));
                              unefonctionquifaitlesdelete(eventgrille);


                              Cela dit vu ton code je pense pas que tu aies besoin de faire d'allocation dans getEventGrille.
                              Ne pourrais pas tu faire une fonction getEventGrilleXY qui prendrait les coordonnées en parametres et te renverrai le contenu de la case XY de ton tableau ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 juin 2007 à 10:02:45

                                En fait, le probleme, c'est que j'ai une grille avec les collision des mur et j'aimerais faire une copie de cette grille en y ajoutant les collisions des monstre, puis je renvoie la valeur de cette nouvelle grille a mon personnage pour qu'il sache ou il ne peut pas aller lors du pathfinding.


                                EDIT : C'est bon c'est réglé. J'ai libéré la memoire dans ma fonction qui fait le pathfinding, quand j'avait fini d'utiliser la grille.
                                Merci pour votre aide.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 juin 2007 à 21:08:11

                                  Sauf que niveau perfs c'est immonde.
                                  Mieux vaut ne pas recopier des énormes tableaux
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Probleme : Fonction - 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