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 :

un petit éclaircissement sur free()


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Mars 2008
    Messages : 24
    Points : 17
    Points
    17
    Par défaut un petit éclaircissement sur free()
    Bonjour,
    j'ai remarqué dans un code que lorsqu'il utilise la fonction free() (dans le code il s'agit de g_free() mais elle se comporte comme free()), l'auteur réinitialise la variable à "NULL", sur la même ligne. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_free (file_name), file_name = NULL;
    Jusqu'ici je me contentait d'utiliser free() seule, et je n'ai jamais eu de problème. Quelle est la différence ? Cela rend le code plus "propre" ou est-ce une simple "manie" de programmeur ?
    Merci d'avance pour vos éclaircissement !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !


    Non ce n'est pas une simple manie de programmeur, c'est une bonne façon de faire surtout si tu es amené à réutiliser ce pointer ou que tu le fasse sans le vouloir. Le truc en fait c'est que lorsque tu libère ton espace mémoire, il n'est plus valide, même s'il possède une valeur quelconque après le free.

    L'initialiser à NULL permet déjà d'une, de pouvoir par exemple tester la variable pour un test de validité par exemple mais aussi d'éviter des comportement indéterminés et ensuite trouver l'erreur dans un grand chose n'est jamais chose aisée.

    Le faire alors que le programme va quitter n'a que peu d'intérêt mais dans les autres cas c'est une précaution et en C il en faut un maximum
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Mettre file_name à NULL après le free() permet d'avoir pour file_name une valeur légale qui permet de savoir qu'il ne pointe sur "rien".
    Bien sûr, cela ne sert à rien si file_name n'est pas utilisé ultérieurement (par exemple, file_name est une variable locale et on est à la fin de la fonction).

    Personnellement, je suis assez réservé sur une utilisation de cette pratique simplement "par sécurité", parce que cela indique que justement on n'est pas très sûr de ce qu'on fait (par exemple, on cherche à se garantir d'un double free, mais c'est alors parce qu'on ne sait pas trop où et par qui le free est normalement fait). Mieux vaut planter le plus tôt possible que continuer à développer un code mal maîtrisé.
    C'est la même chose pour le principe d'initialiser systématiquement les pointeurs à NULL au moment de leur création si cette valeur n'est pas pertinente pour la suite du code.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    C'est la même chose pour le principe d'initialiser systématiquement les pointeurs à NULL au moment de leur création si cette valeur n'est pas pertinente pour la suite du code.
    Autant je suis d'accord avec toi pour le reste, autant sur ce point-là, non..

    Une variable non-initialisée est prise sur la pile.

    Si il y a nombre de niveaux de profondeurs, avec allocations, et paramètres, qui font que la taille de la pile est dépassée, un pointeur non-initialisé n'aura plus de sens à une certaine profondeur , et permettra donc à une fonction d'en bas d'aller jardiner dans le tableau d'en haut (bug déjà arrivé dans une grosse appli sur laquelle j'ai travaillé (Matra), et extrêmement difficile à déceler)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par souviron34
    Une variable non-initialisée est prise sur la pile.
    Une variable initialisée aussi, non ? (variable locale à une fonction)
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Une variable initialisée aussi, non ? (variable locale à une fonction)
    et comment stockes-tu sa valeur d'initialisation dans le binaire ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    et comment stockes-tu sa valeur d'initialisation dans le binaire ??
    Une variable locale est sur la pile. Sa valeur d'initialisation est quelque part (où, on s'en fout, peut-être n'y at'il simplement que du code qui l'initialise sans recopier quelque chose).

    Une variable statique de fonction ou non ne se trouve pas dans la pile. Elle n'est initilisée qu'une fois, au chargement.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Dans le segment de code ?
    Code foo.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void foo(void)
    {
    	int a = 5;
    	(void)a;
    }

    Code foo.s : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foo:
    	push	ebp
    	mov	ebp, esp
    	sub	esp, 16
    	mov	DWORD PTR [ebp-4], 5
    	leave
    	ret
    	.size	foo, .-foo
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Citation Envoyé par diogene Voir le message
    C'est la même chose pour le principe d'initialiser systématiquement les pointeurs à NULL au moment de leur création si cette valeur n'est pas pertinente pour la suite du code.
    Autant je suis d'accord avec toi pour le reste, autant sur ce point-là, non..
    Personnellement, je rejoins l'avis de diogene : si la valeur NULL n'est pas pertinente, pourquoi initialiser la variable avec ? Pourquoi ne pas directement initialiser la variable avec la valeur correcte ?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gl Voir le message
    Personnellement, je rejoins l'avis de diogene : si la valeur NULL n'est pas pertinente, pourquoi initialiser la variable avec ? Pourquoi ne pas directement initialiser la variable avec la valeur correcte ?
    d'une part parce qu'on mélange 2 choses (la déclaration de la variable et l'opération qui va la remplir) , d'autre part parce que, lorsque tu débuggues, c'est nettement plus difficile de savoir où ça plante si tu as plusieurs allocs dans tes initialisations, et enfin parce que si c'est fait dans les initialisations il est plus aisé de sauter sur les tests ou les actions à prendre si l'allocation s'est mal passée, ou si les allocations devaient être faites en cascade..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. un petit éclaircissement sur la syntaxe
    Par JeanNoel53 dans le forum NetBeans
    Réponses: 3
    Dernier message: 04/11/2010, 09h19
  2. autre éclaircissement sur free
    Par lpierard dans le forum Débuter
    Réponses: 4
    Dernier message: 30/07/2009, 17h15
  3. Petit éclaircissement sur la fonction to_days
    Par monstor dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/04/2009, 11h27
  4. Petite question sur le free design de netbeans
    Par altadeos dans le forum NetBeans
    Réponses: 3
    Dernier message: 21/02/2009, 22h48
  5. Petite question sur free()
    Par psyphi dans le forum C
    Réponses: 2
    Dernier message: 17/08/2006, 15h55

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