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 :

Sondage test d'un pointeur.


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut Sondage test d'un pointeur.
    Comment tester vous un pointeur avant de vous en servir?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void testPtr()
    {
      int A = 1;
      int*pA = &A;
      return pA && (*pA)==1;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void testPtr()
    {
      int A = 1;
      int*pA = &A;
      bool bResult = false;
      if (0 != pA)
      {
        bResult = (*pA)==1;
      }
      return bResult;
    }
    Les deux code sont valide et on le même comportement d'après ce que j'ai pu lire sur le site http://www.cppreference.com/wiki/fr/operator_precedence.

    Seconde question:
    Que pensez vous de chaîner des appel de fonction (qui retourne juste un bool) via l'opérateur '&&' ?

    NB: Le compilateur que j'utilise ne gère pas les smart pointer shared_ptr.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 968
    Points
    32 968
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pour ma part je fais comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int* pA = NULL; // toujours initialiser à NULL
    if (pA) // on peut aussi être plus explicite if(pA != NULL) (mais je crois que la première écriture est plus favorisée/souhaitée)
    #define SafeDelete(ptr) if(ptr) delete ptr; ptr = NULL; // une macro pour delete mes pointeurs tranquillement
    SafeDelete(pA);

    Quant au chaining avec &&, il ne me choque/gène pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Pour ma part, c'est std::unique_ptr (ou shared_ptr/weak_ptr, ou auto_ptr si on est vraiment obligé d'en rester à du pré-c++11).

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Je dirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (pA)
    {
        //...
    }
    Je pense qu'il est préférable d'éviter toute référence à 0 ou NULL dans du nouveau code afin de préparer le passage à nullptr.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  5. #5
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Citation Envoyé par Niark13 Voir le message
    Je dirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (pA)
    {
        //...
    }
    Je pense qu'il est préférable d'éviter toute référence à 0 ou NULL dans du nouveau code afin de préparer le passage à nullptr.
    Certe mais ma question porte sur la tendance à tester dans un if le pointeur avant de l'utiliser dans le core du if ou de tester et utiliser avec l'opérande '&&'.

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 477
    Points
    11 477
    Billets dans le blog
    11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SafeDelete(ptr) if(ptr) delete ptr; ptr = NULL;
    ce code est inutile, car delete NULL ne fait rien du tout, donc pas besoin de tester si le pointeur est nul avant de le détruire.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    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 Kalite Voir le message
    Comment testez-vous un pointeur avant de vous en servir?
    J'utilise au maximum des références dès que le pointeur n'a pas à être NULL dans le code.
    Sinon, ensuite c'est la lisibilité qui va surtout jouer. Dans ton exemple (un return ou une affectation par expl), un simple return ptr?0:1; ou return (NULL==ptr)?0:1; suffit. Pour un comportement moins trivial,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(ptr)
    {...}
    else
    {...}

    Citation Envoyé par Kalite Voir le message
    Seconde question:
    Que pensez vous de chaîner des appel de fonction (qui retourne juste un bool) via l'opérateur '&&' ?
    J'ai horreur des lignes de code de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( c1 && c2 && c3 && c4 ...)
    On ne comprend jamais clairement l'objectif du test. Je préfère largement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(IsSomethingTrue())
    {}
    ....

    Citation Envoyé par Kalite Voir le message
    NB: Le compilateur que j'utilise ne gère pas les smart pointer shared_ptr.
    Si ton compilateur permet pour une classe de créer un constructeur, un constructeur de copie, un opérateur d'affectation et un destructeur, alors tu n'as strictement aucune raison de gérer un pointeur nu. Un smart pointeur ce n'est rien de plus qu'une enveloppe RAII.

  8. #8
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Hors sujet:
    Citation Envoyé par 3DArchi Voir le message
    Si ton compilateur permet pour une classe de créer un constructeur, un constructeur de copie, un opérateur d'affectation et un destructeur, alors tu n'as strictement aucune raison de gérer un pointeur nu. Un smart pointeur ce n'est rien de plus qu'une enveloppe RAII.
    Je disais ça pour ceux qui me dirai : "Utilise les smart pointeur !"
    Le compilateur que j'utilise est c++ builder 5.02, donc autant te dire que j'ai pas du tout la STL. De plus, j'ai clairement pas envie de réinventé la roue carré. Je préfère attendre le passage à un compilateur avec STL.

  9. #9
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Citation Envoyé par Kalite Voir le message
    Hors sujet:

    Je disais ça pour ceux qui me dirai : "Utilise les smart pointeur !"
    Oops, j'aurais dû lire jusqu'au bout. Désolé !

    Le compilateur que j'utilise est c++ builder 5.02, donc autant te dire que j'ai pas du tout la STL. De plus, j'ai clairement pas envie de réinventé la roue carré. Je préfère attendre le passage à un compilateur avec STL.
    Il reste quand même sûrement boost::shared_ptr. Après, il faudrait quand même vérifier qu'il fonctionne sous ce compilateur.

    Au passage, il y a des projets comme STLPort qui est disponible gratuitement et qui fournit la STL sous de nombreux compilateurs.

  10. #10
    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
    Citation Envoyé par Kalite Voir le message
    De plus, j'ai clairement pas envie de réinventé la roue carré.
    Tu peux au - rajouter une enveloppe RAII à minima qui interdit la copie (à la volée):
    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
    template<class T>
    struct scopped_ptr
    {
    public:
       explicit scopped_ptr(T*p_):p(p_)
       {}
       ~scopped_ptr()
       {
          delete p;
       }
       T const & operator*() const {return *p;}
       T& operator*(){return *p;}
     
       T const * operator->() const {return p;}
       T* operator->(){return p;}
     
    private:
       scopped_ptr(scopped_ptr const&);
       scopped_ptr&operator=(scopped_ptr const&);
     
       T*p;
    };
    Tu te protèges contre les exceptions, les copies 'cachées' et les fuites mémoires.

    Loïc, dans son article sur les pointeurs intelligents, fait un exercice similaire avec une politique de copie profonde.

    Et, tu peux rendre non copiable tes classes ayant des ressources en propre

  11. #11
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Effectivement sa serait bien mais bon je change de compilateur d'ici la fin du mois. Donc j'ai pas trop d’intérêt a le faire. Mais je conserve l'idée car on ne sais jamais si je retombe sur un vieux compilateur sans STL.

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Citation Envoyé par Kalite Voir le message
    Certe mais ma question porte sur la tendance à tester dans un if le pointeur avant de l'utiliser dans le core du if ou de tester et utiliser avec l'opérande '&&'.
    Ok. J'ai tendance à trouver que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (condition) { A; } else { B; }
    est beaucoup beaucoup plus lisible que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (condition) && (A) || (B);
    qu'il soit question de pointeur ou pas dans le test !
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/05/2010, 15h21
  2. Test de pointeur a null
    Par Seth77 dans le forum C#
    Réponses: 38
    Dernier message: 12/11/2007, 13h16
  3. test de pointeur non null
    Par czezko dans le forum Delphi
    Réponses: 24
    Dernier message: 06/04/2007, 17h04
  4. [Sondage] : Test technique pour un entretien professionnel
    Par __fabrice dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 17/06/2005, 17h29

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