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 :

Comment tester si un pointeur a déjà été alloué ?


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Comment tester si un pointeur a déjà été alloué ?
    Bonjour,

    Je me suis apercu en utilisant valgrind pour combler mes fuites mémoires qu'il m'arrive de désallouer dans un tableau de pointeurs des cellules qui n'ont pas été encore allouées... Est-il possible de tester si un pointeur a déjà été alloué afin de mettre un test avant mon free ?
    Merci de votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Tu initialises ton pointeur à NULL, et s'il est alloué il ne le sera plus. S'il ne l'a pas été ou si l'allocation n'a pas marché le pointeur sera NULL !

    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
    int main ( void )
    {
       char *p = NULL;
     
       if ( .. something .. )
       {
          p = malloc (10 );
       }
     
       if ( p != NULL )
       {
             // .... 
             free ( p );
       }
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci !!

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par Kroll
    Je me suis apercu en utilisant valgrind pour combler mes fuites mémoires qu'il m'arrive de désallouer dans un tableau de pointeurs des cellules qui n'ont pas été encore allouées... Est-il possible de tester si un pointeur a déjà été alloué afin de mettre un test avant mon free ?
    Merci de votre aide.
    L'usage courant est d'appeler free(p), puis de forcer p = NULL. On peut le faire en une ligne avec l'opérateur ',' :
    free(NULL) est défini. Il ne fait rien.

    Evidemment, ça ne modifie pas les copies du pointeur (aliasing), qui continuent à avoir une valeur indéterminée. Il faut donc rester prudent.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par Emmanuel Delahaye
    free(NULL) est défini. Il ne fait rien.
    Le problème à mon avis n'est pas le free ( NULL), mais plutôt le free d'un pointeur non initialisé qui, lui, pourrait amener beaucoup de problèmes

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par DavG
    Citation Envoyé par Emmanuel Delahaye
    free(NULL) est défini. Il ne fait rien.
    Le problème à mon avis n'est pas le free ( NULL), mais plutôt le free d'un pointeur non initialisé qui, lui, pourrait amener beaucoup de problèmes
    Oui, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free (p);
    free (p);
    provoque aussi un comportement indéfini, même si le p est valide.

    Rappel de quelques regles de bon sens :

    http://emmanuel-delahaye.developpez.....htm#pointeurs

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free (p);
    free (p);
    provoque aussi un comportement indéfini, même si le p est valide.

    Rappel de quelques regles de bon sens :
    Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par DavG
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free (p);
    free (p);
    provoque aussi un comportement indéfini, même si le p est valide.

    Rappel de quelques regles de bon sens :
    Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !
    forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par DavG
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free (p);
    free (p);
    provoque aussi un comportement indéfini, même si le p est valide.

    Rappel de quelques regles de bon sens :
    Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !
    Dans le cas trivial d'une variable locale, c'est assez simple, quoique la valeur du pointeur pourrait très bien être transmise à une autre fonction après libération, ce qui constitue un bug grave. Au moins, si on transmet NULL, il risque d'être detecté.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par Yabo
    forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.
    Ce n'est pas ce que j'ai dit : dans le cas d'une variable locale (qui n'est pas retournée par la fonction .. ) c'est inutile, donc il ne s'agit pas du tout d'une sécurité mais d'une habitude de programmation

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut Re: Comment tester si un pointeur a déjà été alloué ?
    Citation Envoyé par DavG
    Citation Envoyé par Yabo
    forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.
    Ce n'est pas ce que j'ai dit : dans le cas d'une variable locale (qui n'est pas retournée par la fonction .. ) c'est inutile, donc il ne s'agit pas du tout d'une sécurité mais d'une habitude de programmation
    Oui dans ce cas particulier, c'est comme ne pas mettre sizeof(char) quand on alloue un char* avec malloc. Certes ca ne sert à rien de le mettre (puisque ca vaut par définition 1) mais ce forcer à le faire nous fais prendre de bonnes habitudes

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

Discussions similaires

  1. Comment tester si un champ est un nombre
    Par the kikouyou dans le forum Langage SQL
    Réponses: 13
    Dernier message: 17/07/2014, 14h57
  2. comment tester l'existance d'un pointeur ?
    Par K-LiBR3 dans le forum Langage
    Réponses: 11
    Dernier message: 07/11/2011, 16h40
  3. Comment tester si fichier est ouvert ?
    Par fusef dans le forum Langage
    Réponses: 7
    Dernier message: 11/08/2004, 18h51
  4. comment tester si une fonction fait bien son travail
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/11/2003, 15h46
  5. Réponses: 10
    Dernier message: 18/11/2003, 18h01

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