Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fuite de mémoire ?

ou pas...

    31 mars 2008 à 15:42:19

    Bonjour,

    J'ai un problème de fuite de mémoire ou plutôt de non fuite de mémoire. En fait, je pars du principe que tout appel à "new" doit être suivi tôt ou tard d'un appel à "delete", or dans le cas qui suit, les "delete" me font planter le programme, comme s'il n'y avait plus rien à "deleter"...

    Je crée en fait un tableau à deux dimensions (dynamiquement) et je suis donc tenté de le supprimer via un delete dans le destructeur de ma classe, mais plantage lors de l'appel du destructeur, car si je commente le code de ce destructeur, le programme marche...

    Pourquoi ces delete sont-ils incorrects ?

    1. #ifndef _SURFACE_H
    2. #define _SURFACE_H
    3.         #include "Pixel.h"
    4.         class Surface {
    5.                 public:
    6.                         Pixel** pixel;
    7.                 public:
    8.                         Surface(int largeur, int hauteur);
    9.                         ~Surface();
    10.         };
    11. #endif


    1. #include "Surface.h"
    2. #include "Pixel.h"
    3. Surface::Surface(int largeur, int hauteur) {
    4.         pixel = (Pixel**) new int[largeur]; // allocation d'une ligne de pointeurs
    5.         for (int i=0; i<largeur; i++) {
    6.                 pixel[i] = new Pixel[hauteur]; // chaque élément de la ligne est une colonne de Pixels
    7.         }
    8. }
    9. Surface::~Surface() {
    10.         for (int i=0; i<largeur; i++) {
    11.                 delete[] pixel[i]; // je supprime les lignes
    12.         }
    13.         delete[] pixel; // puis les colonnes, mais non, ça plante...
    14. }


    EDIT : je viens de voir que la faq c++ traite le sujet, je lis...
    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2008 à 15:49:37

      normal tu essais de détruire des Pixel* alors que tu as allouer des int converti en Pixel**

      1. // mauvais!
      2. pixel = (Pixel**) new int[largeur];
      3. // bon!
      4. pixel = new Pixel*[ largeur ];
      5. delete [] pixel;


      • Partager sur Facebook
      • Partager sur Twitter
        31 mars 2008 à 15:59:10

        Oui, je viens de voir ça sur la faq c++, je faisais une mauvaise allocation, meme si celle-ci marchait parfaitement (un pointeur n'etant qu'un simple entier contenant l'adresse mémoire de ce qu'il pointe). En fait, je fais maintenant :

        1. Surface::Surface(int largeur, int hauteur) {
        2.         this->largeur = largeur;
        3.         this->hauteur = hauteur;
        4.         pixel = new Pixel*[largeur];
        5.         for (int i=0; i<largeur; i++) {
        6.                 pixel[i] = new Pixel[hauteur];
        7.         }
        8. }
        9. Surface::~Surface() {
        10.         for (int i=0; i<largeur; i++) {
        11.                 delete[] pixel[i];
        12.         }
        13.         delete[] pixel;
        14. }


        Mais rien, les delete m'envoient toujours dans les choux, c'est rageant, je ne comprend vraiment pas. J'ai essayé d'entourer les allocations d'un bloc try/catch mais aucune exception n'est lancée, tout va bien...
        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2008 à 16:05:49

          Tu copies tes surfaces ?
          • 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.
            31 mars 2008 à 16:21:09

            Ah, ouais, exact, je passe la surface en parametre direct, sans pointeur, pour que d'autres classes puissent modifier le tableau de pixels, ça marche car le tabeau n'est pas copié, seul son pointeur l'est, mais effectivement, ce tableau est donc supprimé plusieurs fois, par toutes les fonctions appelant la surface si je ne me trompe pas :)

            Si c'est bien ça, je vais corriger direct, j'editerai apres, merci de l'indice :D

            EDIT : et ça marche, merci encore :D
            • Partager sur Facebook
            • Partager sur Twitter
              31 mars 2008 à 16:32:24

              C'est un grand classique.
              Interdis la copie, et passe par référence.
              • 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.
                31 mars 2008 à 17:19:16

                Citation : Obli

                (un pointeur n'etant qu'un simple entier contenant l'adresse mémoire de ce qu'il pointe)



                Faut pas s'y fier. Sur ma machine x86 sizeof( int ) == sizeof( int* ) mais pas nécessairement sur un x64! Dépendant du mode de compilation utilisé.
                • 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