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

GTK+ avec C & C++ Discussion :

[glib]Garray de char* et gestion de la mémoire


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut [glib]Garray de char* et gestion de la mémoire
    Bonjour,

    Je viens de me mettre à la glib, juste pour avoir des structures de données en C.
    Vive les tables de hachage et autres \o/.

    Donc aujourd'hui, j'utilise des GArray. Dans mes tableaux je veux des char*.
    Avant d'ajouter mon char* avec 'g_array_append_val()', j'alloue la mémoire, et je copie la chaine à partir d'une source statique dans le nouvel endroit de mémoire. Je ne pense pas que la glib puisse copier ma chaines de caractères toute seule .
    Bref ... j'ai un jolie char* ... qui un beau jour devra être désalloué.

    Je pensais faire un bête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_array_free(pVFile->pFile,TRUE);
    Et comme j'avais mis à TRUE, je pensais que cela ferait des free() sur les éléments, mais il ne semble pas que ce soit le cas ( vive valgrind ).
    Avant de faire ce g_array_free, je parcours donc mon tableau, pour faire les free de mes éléments.
    Cela ne plante pas ... cela semble marcher ... mais tout les pointeurs sont déclaré par valgrind comme still reachable... du coup je pense toujours avoir une fuite de mémoire.

    Quelqu'un peut t'il m'expliquer un peu le fonctionnement, et comment faire pour faire une libération de la mémoire propre?

    Merci beaucoup
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Bonjour,

    attention à la terminologie :
    pointeur sur char → char *
    pointeur sur char * → char **

    Comme tu n'es pas trop précis sur les termes, c'est difficile de comprendre ce que tu essaies de faire. Nous montrer du code serait mieux. Mais si ce que tu veux faire, c'est avoir un tableau de pointeurs, où chaque élément pointe vers une chaîne de caractères déjà allouée, alors c'est vers GPtrArray qu'il faut t'orienter. Et si c'est un tableau où chaque élément est un caractère, alors utilise GByteArray...

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    :red:

    Je parle d'un tableau qui stockerai des char* ( des chaines de caractères ).
    Je vais voir un peu plus tard sur les GPtrArray...

    ( Je corrige aussi mon post initial )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Je seconde Liberforce, un exemple de code qui leake serait beaucoup plus précis. C'est les détails qui comptent, ce que tu décris est cohérent, mais il y a l'air d'avoir un problème dans ce que tu fais, problème que tu ne décriras pas avec des mots vu que tu n'as pas conscience de ce que c'est (sinon le problème n'existerait pas)

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Oui je comprends votre point de vue . C'est juste que je vais extraire les bouts de code important dans cas, et j'ai un peu peur de louper un truc à vous montrer.

    Donc ... mon fichier .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <glib.h>
     
    typedef struct VFile
    {
    	GArray* pFile;
    }VFile;
     
    void cstVFile(VFile* const pVFile);
    void dstVFile(VFile* const pVFile);
    La définition des fonctions:
    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
     
    void cstVFile(VFile* const pVFile)
    {
    	assert(pVFile);
     
    	pVFile->pFile = g_array_sized_new(FALSE, FALSE, sizeof(char*), NB_LINES_FILE);
    }
     
    void dstVFile(VFile* const pVFile)
    {
    	unsigned int i = 0;
     
    	assert(pVFile);
     
    	for ( i = 0 ; i < pVFile->pFile->len ; i++ )
    	{
    		free(g_array_index(pVFile->pFile,char*,i));
    	}
     
    	g_array_free(pVFile->pFile,TRUE);
     
    #ifdef _SAFE
    	pVFile->pFile = NULL;
    #endif
    }
    Et la partie de l'ajout dans le GArray:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char* ligne = (char*) malloc(sizeof(char)*nbCar);
     
    if ( ligne == NULL )
    {
    	fprintf(stderr, "Erreur d'allocation de mémoire pour la ligne");
    	return -3;
    }
     
    strncpy(ligne, bufferLigne, nbCar);
    ligne[nbCar-1]='\0';
     
    // Ajout de la ligne dans le VFile
    g_array_append_val(pVFile->pFile,ligne);
    Dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    VFile vfileFR;
     
    cstVFile(&vfileFR);
     
    // Appel de la fonction ci dessus ...
     
    dstVFile(&vfileFR);
    Note: Je vais bientot remplacer ce GArray par un GPtrArray qui est une peu plus logique.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Utilise g_strdup plutôt que malloc+strncpy, ça éliminera une possibilité d'erreur. Par contre la doc de g_array_free est explicite sur le fait que c'est à toi de libérer les éléments contenus dans le tableau un à un. Ce que fait g_array_free, c'est la libération de la structure GArray, et potentiellement de la mémoire allouée pour le tableau proprement dit (ie pour stocker les char*).

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  2. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 04/02/2005, 23h18
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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