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

C++ Discussion :

Fuite de mémoire et utilisation de vecteurs contenant des structures en C contenant des pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut Fuite de mémoire et utilisation de vecteurs contenant des structures en C contenant des pointeurs
    Bonjour à tous,
    Dans mon programme en C++ j'utilise une librairie C nommée General Polygon Clipper qui définit la structure gpc_polygon comme suit :
    Code C : 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
    18
    typedef struct                      /* Polygon vertex structure          */
    {
      double              x;            /* Vertex x component                */
      double              y;            /* vertex y component                */
    } gpc_vertex;
     
    typedef struct                      /* Vertex list structure             */
    {
      int                 num_vertices; /* Number of vertices in list        */
      gpc_vertex         *vertex;       /* Vertex array pointer              */
    } gpc_vertex_list;
     
    typedef struct                      /* Polygon set structure             */
    {
      int                 num_contours; /* Number of contours in polygon     */
      int                *hole;         /* Hole / external contour flags     */
      gpc_vertex_list    *contour;      /* Contour array pointer             */
     } gpc_polygon;

    Je dispose également d'une fonction permettant de libérer la mémoire relative à un gpc_polygon :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void gpc_free_polygon(gpc_polygon *p)
    	{
    	int c;
     
    	for (c= 0; c < p->num_contours; c++)
    		FREE(p->contour[c].vertex);
    	FREE(p->hole);
    	FREE(p->contour);
    	p->num_contours= 0;
    	}

    J'utilise dans mon code des std::vector de gpc_polygon, et même des structures C++ ayant comme champ un gpc_polygon voire un std::vector de gpc_polygon ...
    Exemples :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct PolygoneDalleAvecInfos
    	{
                  ...
    	gpc_polygon polygone_gpc; 
    	};
     
     
    struct Niveau
    	{
    	...
    	vector<gpc_polygon> polygonesMursInternesEtageInferieurGPC;
    	};
    ensuite j'ai des map du style :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    map<double,vector<PolygoneDalleAvecInfos>> mMap;
    bref c'est compliqué.

    J'ai des fuites de mémoire en pagaille... j'ai compris que c'était dû aux constructeurs par recopie qui ne copiaient que les pointeurs, ainsi qu'à la non-libération de mémoire lorsque ces structures sont détruites... faut-il et peut-on redéfinir l'opération = pour ma structure C ? et pour la libération de mémoire ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Dans ton code C++, il te faut créer des classe C++ qui vont se référer à tes structures C, et qui vont gérer la mémoire, notamment leur libération à la destruction des objets de ces classes.

    Mais comme un sommet est je suppose partagé par plusieurs polygones, il va falloir te pencher sur les pointeurs intelligents à comptage de références...

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Hello,

    Citation Envoyé par oodini Voir le message
    Mais comme un sommet est je suppose partagé par plusieurs polygones, il va falloir te pencher sur les pointeurs intelligents à comptage de références...
    Vu le code de libération des polygones, je penche pour une autre explication : chaque polygone possède ses propres vertex. Je peux me tromper, mais si ce n'est pas le cas, alors c'est une gageure de se servir de cette librairie.

    Du coup, le destructeur de Niveau devrait contenir quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Niveau::~Niveau()
    {
      std::for_each(
        polygonesMursInternesEtageInferieurGPC.begin(),
        polygonesMursInternesEtageInferieurGPC.end(),
        libere_polygone());
    }
    Où libere_polygone est le foncteur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct libere_polygone
    {
      void operator()(gpc_polygone& p)
      {
        gpc_free_polygon(&p);
      }
    }
    Une autre solution consiste effectivement à encapsuler les gpc_polygon dans une classe RAII, de manière à ce que la destruction du vecteur entraine la destruction de toutes les ressources associées à chaque polygone, et ce, de manière automatique.

    Petite remarque sur le nom des variables : si tu as besoin de noms aussi longs, c'est que quelque chose cloche dans ton architecture. Un nom de variable, de méthode ou de fonction est censé être descriptif ET court.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Vu le code de libération des polygones, je penche pour une autre explication : chaque polygone possède ses propres vertex.
    Exact.

    Je vais essayer ton exemple avec le destructeur de Niveau...

    Petite remarque sur le nom des variables : si tu as besoin de noms aussi longs, c'est que quelque chose cloche dans ton architecture. Un nom de variable, de méthode ou de fonction est censé être descriptif ET court.
    Alors là je dois reconnaître que mon code n'est pas super simple ni propre, mais c'est dû au manque d'info de mon fichier d'entrée (un .xml parsé), qui m'oblige à faire une 1ère lecture, un traitement, puis une 2e lecture avec prise en compte du résultat du traitement avant une écriture dans un fichier...une vraie horreur.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    J'ai codé ça comme constructeur par recopie :
    Code C : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void gpc_copy_polygon(gpc_polygon* copie, gpc_polygon* p)
    	{
    	int i, j;
    	copie->num_contours = p->num_contours;
    	MALLOC(copie->hole, p->num_contours * sizeof(int),"hole flag array creation", int);
    	MALLOC(copie->contour, p->num_contours * sizeof(gpc_vertex_list), "contour creation", gpc_vertex_list);
    	for (i = 0; i < p->num_contours; i++)
    		{
    		if(p->hole[i] == FALSE)
    			{
    			copie->hole[i] = FALSE;			
    			}
    		else
    			{
    			copie->hole[i] = TRUE;	
    			}
     
    		copie->contour[i].num_vertices = p->contour[i].num_vertices;
    		MALLOC(copie->contour[i].vertex, p->contour[i].num_vertices * sizeof(gpc_vertex), "vertex creation", gpc_vertex);
    		for (j = 0; j < p->contour[i].num_vertices; j++)
    			{
    			copie->contour[i].vertex[j].x = p->contour[i].vertex[j].x;
    			copie->contour[i].vertex[j].y = p->contour[i].vertex[j].y;
    			}
    		}
    	}

    ...Et du coup je code toutes les affectations à la main...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par regliss76 Voir le message
    J'ai codé ça comme constructeur par recopie :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void gpc_copy_polygon(gpc_polygon* copie, gpc_polygon* p)
    Ça ne ressemble pas à un constructeur de copie.

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    J'ai davantage cerné la provenance de la fuite de mémoire : cela vient du constructeur par recopie de Polygone_GPC appelé lors du push_back dans le vecteur. Plus particulièrement de ce morceau :
    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
    namespace 
    	{
    	gpc_polygon* deep_copy(gpc_polygon* p)
    		{	
    		gpc_polygon* cp = NULL;
     
    		if(p!=NULL)
    			{
    			cp = (gpc_polygon*)malloc(sizeof(gpc_polygon));
    			gpc_copy_polygon(cp, p);
    			}
     
    		return cp;
    		}
    	}
    Les memory leaks sont longs de 12 bytes, comme la taille allouée pour chaque "cp". Quelle erreur ai-je commise ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par regliss76 Voir le message
    Quelle erreur ai-je commis ?
    Tout d'abord, tu as oublié de faire l'accord du participe passé.

    Ensuite, tu utilises malloc. C'est mal. très mal.

    Enfin, où te charges-tu de libérer la mémoire ?

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Envoyé par regliss76
    Quelle erreur ai-je commis ?

    Tout d'abord, tu as oublié de faire l'accord du participe passé.

    Ensuite, tu utilises malloc. C'est mal. très mal.
    Et toi la majuscule.

    J'utilise malloc car gpc_polygon est une structure C. Polygone_GPC est une classe C++ chargée justement de gérer ce problème de mémoire, d'où le destructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Polygone_GPC::~Polygone_GPC()
    	{
    	gpc_free_polygon(m_poly);
    	}

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Dans un premier temps, remplace tous tes malloc par MALLOC_DEBUG, tes free par FREE_DEBUG, et ajoute un SHOW_DEBUG_ALLOC() à la fin de ton programme.

    Code my_debug_malloc.h : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #ifndef my_debug_malloc_h
    #define my_debug_malloc_h 
    // décommenter pour débugger les malloc/free
    // #define MY_DEBUG_MALLOC
     
    #include <vector>
    #include <sstream>
    #include <string>
     
    #ifdef MY_DEBUG_MALLOC
     
    #define MALLOC_DEBUG(s) malloc_debug((s), __FILE__, __LINE__)
    #define FREE_DEBUG(p) free_debug(p)
    #define SHOW_DEBUG_ALLOC() do { show_debug_alloc(); } while (0)
     
    class allocation 
    {
    private:
      void* m_p;
      std::size_t m_length;
      std::string m_file;
      int m_line;
    public:
      allocation() : m_p(NULL), m_length(0), m_line(0) { }
      allocation(const allocation& other)
        : m_p(other.m_p)
        , m_length(other.m_length)
        , m_file(other.m_file)
        , m_line(other.m_line)
      { }
      void swap(allocation& other)
      {
        std::swap(m_p, other.m_p);
        std::swap(m_length, other.m_length);
        m_file.swap(other.m_file);
        std::swap(m_line, other.m_line);
      }
      allocation& operator=(const allocation& other)
      {
        allocation(other).swap(*this);
        return *this;
      }
      const p* pointer() const { return m_p; }
      const std::string& filename() const { return m_file; }
      std::size_t length() const { return m_length; }
      int line() const { return m_line; }
    };
     
    inline std::vector<allocation>& get_allocations()
    {
      static std::vector<allocation> allocations;
      return allocations;
    }
     
    inline void *malloc_debug(std::size_t length, const char* filename, int line)
    {
      void* p = malloc(length);
      get_allocations().push_back(allocation(p, length, filename, line));
      return p;
    }
     
    inline void free_debug(void* p)
    {
      std::vector<allocation>::iterator it;
      it = std::find_if(get_allocations().begin(), get_allocations().end(), allocation_comp(p));
      if (it == get_allocations().end()) {
        get_allocations().erase(it);
      }
      free(p);
    }
     
    inline show_debug_alloc()
    {
      std::vector<allocation>& allocs = get_allocations();
      for (std::size_t i=0; i<allocs.size(); ++i) {
        std::stringstream out; 
        out << "p = " << allocs[i].pointer() << "of size " << allocs[i].length() << 
          " allocated in file " << 
          allocs[i].filename() << " line " << allocs[i].line() << std::endl;
       SOME_DISPLAY_FUNCTION(out.c_str());
      }
    }
     
    #else
    #define MALLOC_DEBUG(s) malloc(s)
    #define FREE_DEBUG(p) free(p)
    #define SHOW_DEBUG_ALLOC()
    #endif
     
    #endif // my_debug_malloc_h

    Exemple:
    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdlib.h>
    #include "my_debug_malloc.h"
     
    int main()
    {
      char *p1 = MALLOC_DEBUG(10);
      char *p2 = MALLOC_DEBUG(20);
     
      MALLOC_FREE(p2);
     
      SHOW_DEBUG_ALLOC();
    }

    Devrait afficher la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p = xxxxxxx allocated in file main.c line 6
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43) : error C2143: erreur de syntaxe*: absence de ';' avant '*'
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43) : warning C4183: 'pointer'*: type de retour manquant*; fonction membre retournant 'int' prise par défaut
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(24) : error C2758: 'allocation::p'*: doit être initialisé(e) dans la liste des initialiseurs base/membre du constructeur
    1>        d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43)*: voir la déclaration de 'allocation::p'
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(30) : error C2758: 'allocation::p'*: doit être initialisé(e) dans la liste des initialiseurs base/membre du constructeur
    1>        d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43)*: voir la déclaration de 'allocation::p'
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(43) : error C2440: 'return'*: impossible de convertir de 'void *const ' en 'int *'
    1>        La conversion de 'void*' en pointeur vers non 'void' nécessite un cast explicite
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(58) : error C2661: 'allocation::allocation'*: aucune fonction surchargée ne nécessite 4 arguments
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(65) : error C3861: 'allocation_comp'*: identificateur introuvable
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(73) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(80) : error C2039: 'c_str'*: n'est pas membre de 'std::basic_stringstream<_Elem,_Traits,_Alloc>'
    Ouch... En ayant modifié/ajouté quelques trucs :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #ifndef my_debug_malloc_h
    #define my_debug_malloc_h 
    // décommenter pour débugger les malloc/free
    #define MY_DEBUG_MALLOC
     
    #include <vector>
    #include <sstream>
    #include <string>
     
    #ifdef MY_DEBUG_MALLOC
     
    #define MALLOC_DEBUG(s) malloc_debug((s), __FILE__, __LINE__)
    #define FREE_DEBUG(p) free_debug(p)
    #define SHOW_DEBUG_ALLOC() do { show_debug_alloc(); } while (0)
     
    class allocation 
    {
    private:
     
      void* m_p;
      std::size_t m_length;
      std::string m_file;
      int m_line;
     
    public:
     
      allocation() : m_p(NULL), m_length(0), m_line(0) { }
      allocation(void * p, std::size_t length, std::string filename, int line) : m_p(p), m_length(length), m_line(line) { }
      allocation(const allocation& other)
        : m_p(other.m_p)
        , m_length(other.m_length)
        , m_file(other.m_file)
        , m_line(other.m_line)
      { }
     
      void swap(allocation& other)
      {
        std::swap(m_p, other.m_p);
        std::swap(m_length, other.m_length);
        m_file.swap(other.m_file);
        std::swap(m_line, other.m_line);
      }
     
      allocation& operator=(const allocation& other)
      {
        allocation(other).swap(*this);
        return *this;
      }
     
      const void* pointer() const { return m_p; }
      const std::string& filename() const { return m_file; }
      std::size_t length() const { return m_length; }
      int line() const { return m_line; }
    };
     
    inline std::vector<allocation>& get_allocations()
    {
      static std::vector<allocation> allocations;
      return allocations;
    }
     
    inline void *malloc_debug(std::size_t length, const char* filename, int line)
    {
      void* p = malloc(length);
      get_allocations().push_back(allocation(p, length, filename, line));
      return p;
    }
     
    inline void free_debug(void* p)
    {
      std::vector<allocation>::iterator it;
      it = std::find_if(get_allocations().begin(), get_allocations().end(), allocation_comp(p));
      if (it == get_allocations().end()) {
        get_allocations().erase(it);
      }
      free(p);
    }
     
    inline show_debug_alloc()
    {
      std::vector<allocation>& allocs = get_allocations();
      for (std::size_t i=0; i<allocs.size(); ++i) {
      std::stringstream out; 
        out << "p = " << allocs[i].pointer() << "of size " << allocs[i].length() << 
          " allocated in file " << 
          allocs[i].filename() << " line " << allocs[i].line() << std::endl;
    	SOME_DISPLAY_FUNCTION(out.str());
      }
    }
     
    #else
    #define MALLOC_DEBUG(s) malloc(s)
    #define FREE_DEBUG(p) free(p)
    #define SHOW_DEBUG_ALLOC()
    #endif
     
    #endif // my_debug_malloc_h
    j'arrive à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(72) : error C3861: 'allocation_comp'*: identificateur introuvable
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(80) : error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(87) : error C3861: 'SOME_DISPLAY_FUNCTION'*: identificateur introuvable
    1>d:\data\développement\visual studio 2008\nbdmtoifc\nbdmtoifc_0100048\nbdmtoifc_lib\my_debug_malloc.h(89) : warning C4508: 'show_debug_alloc'*: la fonction doit retourner une valeur*; type de retour 'void' pris par défaut

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Oui, il y a quelques erreurs ; en même temps, j'ai fait ça à main levée, pendant que je débugais un module kernel un poil étrange pour Linux. J'ai pu rater quelques petits trucs

    1/ allocation_comp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct allocation_comp
    {
       allocation_comp(void *p) : m_p(p) { }
       bool operator()(const allocation& a)
       { return a.pointer() == p; }
    };
    2/ et 4/ ligne 79 ==> inline void show_debug_alloc()

    3/ SOME_DISPLAY_FUNCTION est quelque chose que tu dois écrire. Selon ton OS et le type de sous-système (console, GUI, ...), ça peut être std::cout << out.str() ou OutputDebugString(out.str().c_str()), etc.

    A toi de voir.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Merci pour ton aide.
    Ca donne ça :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #ifndef my_debug_malloc_h
    #define my_debug_malloc_h 
    // décommenter pour débugger les malloc/free
    #define MY_DEBUG_MALLOC
     
    #include <vector>
    #include <sstream>
    #include <string>
     
    #ifdef MY_DEBUG_MALLOC
     
    #define MALLOC_DEBUG(s) malloc_debug((s), __FILE__, __LINE__)
    #define FREE_DEBUG(p) free_debug(p)
    #define SHOW_DEBUG_ALLOC() do { show_debug_alloc(); } while (0)
     
    class allocation 
    {
    private:
     
      void* m_p;
      std::size_t m_length;
      std::string m_file;
      int m_line;
     
    public:
     
      allocation() : m_p(NULL), m_length(0), m_line(0) { }
      allocation(void * p, std::size_t length, std::string filename, int line) : m_p(p), m_length(length), m_line(line) { }
      allocation(const allocation& other)
        : m_p(other.m_p)
        , m_length(other.m_length)
        , m_file(other.m_file)
        , m_line(other.m_line)
      { }
     
      void swap(allocation& other)
      {
        std::swap(m_p, other.m_p);
        std::swap(m_length, other.m_length);
        m_file.swap(other.m_file);
        std::swap(m_line, other.m_line);
      }
     
      allocation& operator=(const allocation& other)
      {
        allocation(other).swap(*this);
        return *this;
      }
     
      const void* pointer() const { return m_p; }
      const std::string& filename() const { return m_file; }
      std::size_t length() const { return m_length; }
      int line() const { return m_line; }
     
     
    };
     
    struct allocation_comp
    {
       void* m_p;
       allocation_comp(void *p) : m_p(p) { }
       bool operator()(const allocation& a)
       { return a.pointer() == m_p; }
    };
     
    inline std::vector<allocation>& get_allocations()
    {
      static std::vector<allocation> allocations;
      return allocations;
    }
     
    inline void *malloc_debug(std::size_t length, const char* filename, int line)
    {
      void* p = malloc(length);
      get_allocations().push_back(allocation(p, length, filename, line));
      return p;
    }
     
    inline void free_debug(void* p)
    {
      std::vector<allocation>::iterator it;
      it = std::find_if(get_allocations().begin(), get_allocations().end(), allocation_comp(p));
      if (it == get_allocations().end()) {
        get_allocations().erase(it);
      }
      free(p);
    }
     
    inline void show_debug_alloc()
    {
      std::vector<allocation>& allocs = get_allocations();
      for (std::size_t i=0; i<allocs.size(); ++i) {
      std::stringstream out; 
        out << "p = " << allocs[i].pointer() << "of size " << allocs[i].length() << 
          " allocated in file " << allocs[i].filename() << " line " << allocs[i].line() << std::endl;
    	std::cout << out.str(); 
      }
    }
     
    #else
    #define MALLOC_DEBUG(s) malloc(s)
    #define FREE_DEBUG(p) free(p)
    #define SHOW_DEBUG_ALLOC()
    #endif
     
    #endif // my_debug_malloc_h
    Par contre le fait que j'ajoute my_debug_malloc.h dans ma bib. C (ie dans gpc.h) me donne ceci :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    1>Génération de code en cours...
    1>Compilation en cours...
    1>gpc.c
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(39) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(39) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(41) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(42) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(43) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(44) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(45) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(46) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(47) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(48) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(49) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(49) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(49) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(49) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(50) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(50) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(50) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(50) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(51) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(52) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(53) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(54) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(55) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(56) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstdio(56) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(19) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : error C2059: erreur de syntaxe*: ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : error C2143: erreur de syntaxe*: absence de '{' avant ':'
    1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\cstring(21) : fatal error C1003: le nombre d'erreurs est supérieur à 100*; arrêt de la compilation
    1>Le journal de génération a été enregistré à l'emplacement "file://d:\Data\Développement\Visual Studio 2008\NBDMtoIFC\NBDMtoIFC_0100048\NBDMtoIFC_lib\Debug\BuildLog.htm"
    1>NBDMtoIFC_lib - 102 erreur(s), 2 avertissement(s)
    ...

  14. #14
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut Fuite de mémoire (suite)
    Mes memory leaks, donc... la zone allouée non libérée est ici :
    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
    18
    19
    20
    namespace 
        {
        gpc_polygon* deep_copy(gpc_polygon* p)
            {    
            gpc_polygon* cp; 
     
            if(p==NULL)
                {
                cp = NULL;
                }
     
            else
                {
                cp = (gpc_polygon*)MALLOC_DEBUG(sizeof(gpc_polygon)); // <---- là
                gpc_copy_polygon(cp, p);
                }
     
            return cp;
            }
        }
    Je ne comprends pas pourquoi elle n'est pas libérée, je passe bien par la suite par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Polygone_GPC::~Polygone_GPC()
        {
        gpc_free_polygon(m_poly);
        }
    avec m_poly ayant la même adresse que cp.
    Dois-je rajouter un free sur m_poly ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Polygone_GPC::~Polygone_GPC()
        {
        gpc_free_polygon(m_poly);
        FREE_DEBUG(m_poly);
        }
    Ce code buggue impossible de faire ...

    C'est vraiment l'ensemble de la gestion de la mémoire allouée pour ce pointeur sur une structure C que j'aimerais comprendre... peut-être que j'essaie de libérer de la mémoire déjà libérée (utilisation de smart pointers ?)...

    De même si j'essaie d'appeler ma lib C ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gpc_polygon_clip(GPC_UNION,mapPlanchersParType[id_type].inside(),gpc_piece.inside(),mapPlanchersParType[id_type].inside());
    (les inside() permettant d'accéder aux pointeurs sur struct C), je ne comprends pas pourquoi je n'arrive pas à récupérer le résultat (correctement calculé dans la lib, j'ai vérifié) dans mapPlanchersParType[id_type]...

  15. #15
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par défaut
    je ne comprends pas pourquoi elle n'est pas libérée, je passe bien par la suite
    si je ne me trompe pas tu fais un malloc sur une variable locale à la fonction deep_copy de type gpc_polygon* cp.
    Or une fois que deep_copy() est terminée , cp ne vaut plus rien.
    Donc tu vas avoir un pointeur qui ne pointe sur aucune variable..

    Si tu veux utiliser des listes chainées vaut mieux prendre std::list ou std::vector en C++!

  16. #16
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    Je ne veux pas utiliser de liste chaînée, je souhaite faire une classe C++ qui "wrappe" la structure C gpc_polygon et gère la mémoire associée.

    Pour cela je donne comme attribut de ma classe C++ un pointeur sur gpc_polygon. Quand dois-je allouer la mémoire nécessaire pour mon pointeur ? Dans le constructeur de la classe C++ ? Et comment faire le constructeur par recopie et la surcharge de l'opérateur d'affectation dans ce cas ?

    Je pensais que le return à la fin de deep_copy() permettait de retourner la zone allouée en même temps que le gpc_polygon* et que du coup il n'y avait pas de memory leak.

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 79
    Par défaut
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Polygone_GPC::Polygone_GPC(gpc_polygon* p) : m_poly(p)
    	{ 
    	}
     
    Polygone_GPC::Polygone_GPC() : m_poly(NULL)
    	{
    	}
     
    // le constructeur par copie doit faire une copie profonde, 
    // cad copier le contenu et ce qui est contenu dans le contenu
    Polygone_GPC::Polygone_GPC(const Polygone_GPC& other) 
    	{
    	if(other.m_poly != NULL)
    		{
    		m_poly = (gpc_polygon*)MALLOC_DEBUG(sizeof(*other.m_poly));
    		gpc_copy_polygon(m_poly,other.m_poly);
    		}
    	else
    		m_poly = NULL;
    	}
     
    Polygone_GPC::~Polygone_GPC()
    	{
    	gpc_free_polygon(m_poly);
    	}
     
    // swap idiom : résistant aux exceptions, et facile à écrire !
    Polygone_GPC& Polygone_GPC::operator=(const Polygone_GPC& other)
    	{
    	Polygone_GPC(other).swap(*this);
    	return *this;
    	}
     
    void Polygone_GPC::swap(Polygone_GPC& other)
    	{
    	std::swap(m_poly, other.m_poly);
    	}
     
    // parce qu'il y aura bien des fonctions qui pourront en
    // avoir besoin
    const gpc_polygon* Polygone_GPC::inside() const
    	{
    	return m_poly;
    	}
     
    gpc_polygon* Polygone_GPC::inside()
    	{ 
    	return m_poly;
    	}
    En écrivant le constructeur par recopie de la sorte, j'ai toujours le même problème... la zone allouée pour m_poly n'est pas libérée. Vu que cette fuite survient lors d'un push_back dans un vecteur, je pense que cela vient de la définition de l'opérateur d'affectation, non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 02/12/2013, 20h49
  2. Réponses: 3
    Dernier message: 06/09/2010, 18h26
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 10h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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