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 :

Tester les Pointeurs Null


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Points : 59
    Points
    59
    Par défaut Tester les Pointeurs Null
    Bonjour,

    Ma question est sur les pointeurs null
    De manière générale, est ce que vous effacez automatiquement les objets pointés par les pointeurs membres de la classe? Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Class Droit
    {
    Point* p1;
    Point* p2;
    Droit(){};
    ~Droit(){
    delete p1;
    delete p2;
    };
    }
    Par contre, il faut bien tester d abord si les pointeurs sont nulls avant de faire delete comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (p1!=0) delete p1;
    Par contre quand je teste le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	string* name = new string;
    	string test="test";
    	if (name != 0)
    		cout << "Pointer not null"<<endl;
    	delete name;
    	if (name != 0)
    		cout << "Pointer null"<<endl;
    Le resultat est

    Pointer not null
    Pointer null
    Ce qui est bizarre

    Merci pour les explications

  2. #2
    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 hibou107 Voir le message
    Par contre, il faut bien tester d abord si les pointeurs sont nulls avant de faire delete comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (p1!=0) delete p1;
    Ce n'est pas nécessaire, il est licite d'appeler delete sur un pointeur NULL (et ça ne fait rien)

    Citation Envoyé par hibou107 Voir le message
    Par contre quand je teste le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	string* name = new string;
    	string test="test";
    	if (name != 0)
    		cout << "Pointer not null"<<endl;
    	delete name;
    	if (name != 0)
    		cout << "Pointer null"<<endl;
    delete libère la mémoire mais ne change pas la valeur de name. Donc name ne vaut pas 0 mais conserve la valeur qu'il avait avant l'appel de delete.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    ...
    Ta définition de classe est invalide, et oui, il est "obligatoire" de libérer la mémoire allouée.

    Quant à ta question finale, tu fais deux fois le même test avec deux textes différents, donc normal que les deux s'affichent !

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    ...
    Ta définition de classe est invalide, et oui, il est "obligatoire" de libérer la mémoire allouée.

    Quant à ta question finale, tu fais deux fois le même test avec deux textes différents, donc normal que les deux s'affichent !
    En fait après le premier test j'ai fait delete, et le deuxième test s'affiche toujours

  5. #5
    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 hibou107 Voir le message
    En fait après le premier test j'ai fait delete, et le deuxième test s'affiche toujours
    Oui, car comme expliqué ci-dessus, delete libère la mémoire mais ne change pas la valeur du pointeur. Il vaut donc exactement la même chose avant qu'après le delete (mais on ne peut plus le déréférencé après).

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par hibou107 Voir le message
    De manière générale, est ce que vous effacez automatiquement les objets pointés par les pointeurs membres de la classe?
    Non. De manière général, j'utilise un pointeur intelligent. De manière générale, la gestion 'à la main' des pointeurs est source d'erreur surtout chez les débutants => à proscrire.

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    153
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 153
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Non. De manière général, j'utilise un pointeur intelligent. De manière générale, la gestion 'à la main' des pointeurs est source d'erreur surtout chez les débutants => à proscrire.
    Merci pour ton orientation!

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un conseil que j'ai lu je ne sais plus trop où, c'est que pour être complètement résistant aux exceptions, une classe donnée ne doit pas gérer "à la main" plus d'une seule ressource. Le reste doit être géré par des pointeurs intelligents et d'autres classes du genre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par gl Voir le message
    Ce n'est pas nécessaire, il est licite d'appeler delete sur un pointeur NULL (et ça ne fait rien).
    C'est exact. En revanche, mettre une valeur de 0 permet d'indiquer qu'on a libéré la mémoire, ce qui peut être utile.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par oodini Voir le message
    C'est exact. En revanche, mettre une valeur de 0 permet d'indiquer qu'on a libéré la mémoire, ce qui peut être utile.
    Tu peux même aller jusqu'à dire que c'est indispensable...

    D'abord, pour te permettre de vérifier la validité du pointeur, car tu ne peux absolument pas présumer de l'utilisation qui sera faite de la mémoire après la libération (elle pourrait parfaitement être utilisée pour un autre objet, d'un type tout à fait différent ), mais aussi, et surtout, pour éviter les tentatives de double libération de la mémoire, qui occasionnent systématiquement une erreur de segmentation

    Et je ne te parle même pas des problèmes que tu pourrais rencontrer si, par malheur, l'adresse représentée par le pointeur avait été réallouée à un autre objet de type compatible et toujours utilisé...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ma formule utilisait une ellipse, mais je suis tout à fait d'accord avec toi. :-)

  12. #12
    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 koala01 Voir le message
    Tu peux même aller jusqu'à dire que c'est indispensable...
    Dans le corps d'un destructeur (ce qui le cas ici), je ne suis pas sur que le qualificatif indispensable ne soit pas un peu excessif. Mais je suis d'accord ça reste une très bonne habitude à prendre.

    Ceci étant, je rejoins quand même davantage l'avis de 3DArchi pour privilégier l'utilisation de smart pointer (ou conteneur standard selon l'utilisation que l'on va faire de la zone alloué).

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par gl Voir le message
    Dans le corps d'un destructeur (ce qui le cas ici), je ne suis pas sur que le qualificatif indispensable ne soit pas un peu excessif. Mais je suis d'accord ça reste une très bonne habitude à prendre.
    C'est, effectivement, le problème des phrases prises à l'emporte pièce : on trouvera toujours une exception qui viendra confirmer la règle

    Il est vrai que, dans un destructeur, le terme est peut être quelque peux excessif, mais, lorsque l'on sait que, hors du contexte d'un pointeur, NULL aura un comportement de no-op, on peut se dire que, même si on ne court pas vraiment les risques que je cite dans ce cas particulier, il vaut mieux garder l'habitude de passer la valeur d'un pointeur sur lequel on a invoquer delete à null (car "ca ne mange de toutes façons pas de pain" ) , plutôt que de risquer de ne pas le faire ailleurs
    Ceci étant, je rejoins quand même davantage l'avis de 3DArchi pour privilégier l'utilisation de smart pointer (ou conteneur standard selon l'utilisation que l'on va faire de la zone alloué).
    Il va de soi que je ne conseillerai jamais l'usage de pointeurs nus si une alternative existe... je ne me prononçais que sur la pratique qui consiste à faire passer la valeur d'un pointeur à null après avoir invoqué delete dessus
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Continuons à chipoter

    Citation Envoyé par koala01 Voir le message
    Il va de soi que je ne conseillerai jamais l'usage de pointeurs nus si une alternative existe...
    En réalité, à mon avis, la bonne approche est celle de Médinoc : une classe doit gérer une seule ressource (ce qui est une responsabilité en soi) + SRP = utilisation d'une classe dédiée (smart ptr, conteneur type vector, etc.). Rien ne m'empêche d'utiliser un pointeur nu lorsqu'il n'est pas lié à une ressource car contrairement à une référence il est réassignable.

Discussions similaires

  1. eviter les pointeurs NULL
    Par loufoque dans le forum C++
    Réponses: 30
    Dernier message: 05/08/2008, 20h33
  2. [ASE 12.0.3] Comment tester les valeurs nulles (T-SQL)
    Par msomso dans le forum Adaptive Server Enterprise
    Réponses: 7
    Dernier message: 02/01/2008, 09h07
  3. Réponses: 11
    Dernier message: 03/11/2007, 18h33
  4. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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