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 :

gtk_text_buffer_get_text () : allocation de mémoire ou non ?


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut gtk_text_buffer_get_text () : allocation de mémoire ou non ?
    Bonjour

    Je regarde : https://developer.gnome.org/gtk3/sta...uffer-get-text . Mon anglais me pose peut-être encode des soucis... Mais, je ne vois pas si je dois désallouer la mémoire après ? Ou si je dois copier la chaîne et non l'adresse si je veux mémoriser l'état.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    J'ai vu que tu as déjà eu une discussion à propos de newly-allocated dont le sens est clair.
    Par contre je trouve la doc
    Returns an allocated UTF-8 string
    pas claire mais je pense que c'est le même sens, à savoir que c'est à toi de libérer l'espace. Pour ce qui est de mémoriser l'état et continuer à utiliser le buffer en le modifiant, il faut probablement copier la chaîne ailleurs.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Citation Envoyé par pvincent Voir le message
    Par contre je trouve la doc pas claire mais je pense que c'est le même sens, à savoir que c'est à toi de libérer l'espace. Pour ce qui est de mémoriser l'état et continuer à utiliser le buffer en le modifiant, il faut probablement copier la chaîne ailleurs.
    Je trouve que ces deux actions sont contradictoire :
    si la mémoire est à libérer, alors, la chaîne envoyée n'a plus rien à voir avec le buffer.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    En fait, il faudrai analyser le code du widget pour être sûr de ce qui ce passe et j'ai un peu la flemme de le faire, surtout qu'on risque d'avoir affaire à la Glib au milieu.

    Ce que j'imagine c'est le schéma suivant:
    quand le textbuffer est créé, il alloue une chaîne dont le pointeur est retourné par la fonction,
    mais si le contenu est modifié, cette chaîne peut être ré-allouée par realloc() et donc le pointeur va changer et le contenu ne sera pas conservé tel quel;
    cela ne signifie pas que la cette chaîne est libérée automatiquement ensuite et c'est ta responsabilité de le faire.

    Si cela est vrai, il faut donc copier la chaîne si on veut la préserver et libérer soi-même celle (ré)allouée par le widget si on veut éviter les fuites mémoires.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je suis assez septique quant à la modification dynamique car lors de l'appel de cette fonction on donne un début un une fin. La fin impliquant un 0 de fin de chaîne, le résultat doit être une chaîne allouée qui ne dépendra plus de la zone de texte originale. Je prend ce pari et je ferai des tests.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    je crois que la chaîne est allouée spécialement pour. Quand on regarde ceci : https://developer.gnome.org/gtk3/sta...entry-get-text , on voit bien la différence.

    On voit aussi la différence pour la compilation :
    ceci ne génère pas de warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _perso->perso.commentaire=gtk_text_buffer_get_text(texte,&debut,&fin,TRUE);
    Ceci en génère un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _perso->perso.sociale=gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(_perso->modif->builder,"sociale")));
    Et je dois mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _perso->perso.sociale=g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(_perso->modif->builder,"sociale"))));
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    J'ai essayé de remonter à la main dans le source de gtk+-3.12.2 la chaîne des appels en supposant que la longueur du buffer à varié et cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gtk_text_buffer_get_text ()
    gtk_text_iter_get_text ()
    _gtk_text_btree_get_text ()
    copy_segment ()
    g_string_append_len ()
    g_string_insert_len ()
    g_string_maybe_expand ()
    g_realloc ()
    Sauf erreur de ma part, cela voudrai dire que dans ce cas, on tombe bien sur g_realloc () qui modifie la valeur du pointeur, donc, si tu te contente de stocker l'ancien pointeur, il n'est plus valide.
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  8. #8
    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
    Points : 2 002
    Points
    2 002
    Par défaut annotations
    C'est dans ce but qu'il existe des annotations dans le code source, utilisées pour l'introspection. Ainsi les différents bindings générés peuvent extraire les caractéristiques des fonctions à partir de mots clés. Exemple: gtk_text_buffer_get_tag_table, qui est dans la même classe, mais a lui l'annotation "transfer-none". En passant la souris sur cette annotation, on voit que cette fonction ne renvoie pas un pointeur à libérer.

    En revanche, "transfer-full" indique que l'appelant est responsable de cela mémoire et doit la libérer. C'est ce que devrait avoir gtk_text_buffer_get_text, c'est donc peut être juste un petit bug de documentation de gtk_text_buffer_get_text, mais le texte est quand même assez explicite. La fonction en elle même ne peut de toute façon pas renvoyer un pointeur vers la chaîne en cours d'utilisation (où serait le caractère nul de fin de chaine ? Comment masquer les caractères invisibles ?), c'est donc forcément une copie pour les besoins ponctuels de l'appelant.

    Plus d'infos sur les annotations ici:
    https://wiki.gnome.org/Projects/GObj...on/Annotations

    Le code source de GtkTextBuffer:
    https://git.gnome.org/browse/gtk+/tr...tktextbuffer.c
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

Discussions similaires

  1. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  4. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

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