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 :

quand utiliser un pointeur ?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut quand utiliser un pointeur ?
    Bonjour, j'ai une classe comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MaClass
    {
    public :
    blabla
     
    private :
    T1 _ti;
    T2 _t2
    };
    où T1 et T2 sont 2 autres classes. Devrais-je plutôt faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class MaClass
    {
    public :
    blabla
     
    private :
    T1 * _ti;
    T2 * _t2
    };
    j'ai mis des pointeurs. Sachant que dans mon code, je ferais un new dans le constructeur et un delete dans le destructeur.

    De la même manière, que vaut-il mieux faire :

    ou bien

    où T est une classe. Je me dis qu'en fait, un vector est simplement un malloc, donc tout le contenu du vector (les éléments v[i]) sont dans le tas. Donc quel serait l'intérêt d'utiliser la 2e méthode plutôt que la 1e ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    il y a plusieurs raisons pour lesquelles on ne va pas utiliser un pointeur
    • pour bien montrer que la durée de vie de l'instance associée au membre est égale à celle de l'instance de la classe conteneur, ce qui est très important
    • parce qu'ainsi on a moins de doute sur le fait que l'instance associée au membre n'est pas partagée/référencée ailleurs
    • un membre alloué/désaloué explicitement c'est 'fatigant' à écrire et ajoute du code inutile
    • parce que cela perturbe la lecture du code, on se dit que s'il est alloué explicitement c'est parce qu'il y a une bonne raison
    • parce qu'on prend le risque d'oublier de faire les libérations explicites
    • parce qu'on utilise plus de cellules allouées séparément dans le tas, ce qui n'est pas une bonne chose en temps CPU et en espace mémoire nécessaire
    • parce que l'utilisation d'un pointeur est moins naturelle que celle d'une référence, il faut constamment le déréférencer


    Cela est donc aussi valable pour les membre étant des vector, même si effectivement dés que le vecteur n'est pas vide alors le 'vrai' vecteur interne est alloué dans le tas.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Donc en gros, si je comprends bien, le seul intérêt du pointeur c'est d'avoir plusieurs variables qui pointent vers la même zone mémoire. Sinon c'est inutile.

    J'ai fait pas mal de C, et j'avoue que j'utilisais les pointeurs à gogo

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Généralement on préferera la version sans pointeur, qui est beaucoup plus simple et surtout sécurisé.

    C'est comme pour les variables globales dans un autre thread, utilise les pointeurs seulement si tu sais pourquoi!

    Aussi en C++ on voit des pointeurs utilisés pour le passage des paramètres de fonction par référence.. alors qu'en C++ il existe.. les références (&) qui servent à ça!

    ( au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void testAvecPtr( std::string * t ){}
    on va utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void testAvecRef( std::string & t ) {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string toto;
     
    testAvecPtr( &toto );
     
    testAvecRef( toto );
    )

    Généralement un code C++ de qualité utilise très peu d'allocation dynamique directe (new/delete) et si jamais il le fait, ça va être grâce aux pointeurs intelligent (tu peux regarder tr1::shared_ptr ou boost::shared_ptr) qui n'utilisent que "new" (le delete sera automatique).

    Là où l'utilisation des pointeurs est obligatoire (toujours enrobé dans un pointeur intelligent), c'est lors de l'utilisation du polymorphisme pour créer une classe fille et la stocker dans un pointeur de la classe mère.

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 533
    Points : 6 709
    Points
    6 709
    Par défaut
    le seul intérêt du pointeur c'est d'avoir plusieurs variables qui pointent vers la même zone mémoire.
    C'est l'un des intérêts mais ce n'est pas le 'vrai' car rien empêche de faire un pointeur sur un membre via '&' y compris ou d'utiliser une référence.

    En dehors des tableaux de taille indéterminée à la compilation ou variable dans le temps, la vraie raison de l'utilisation d'un pointeur vers une instance de classe est sa durée de vie, c'est à dire le moment où elle est crée et détruite.

    Par exemple si quelque soit la raison vous ne pouvez pas créer l'instance supportée par ti_ au moment ou vous créez l'instance de MaClass qui le contient, alors la seule solution est de passer par un pointeur (initialement nul).

    En résumé le bon réflexe est de ne pas utiliser de pointeur par défaut, et de le faire que si cela est nécessaire.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    OK, merci pour vos réponses.

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Et si vraiment y'a besoin d'un pointeur (voir au dessus) alors ne pas l'utiliser brut, mais un smart ptr .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

Discussions similaires

  1. Quand utiliser les pointeurs ?
    Par kedare dans le forum Qt
    Réponses: 4
    Dernier message: 22/08/2007, 11h50
  2. Réponses: 10
    Dernier message: 08/02/2005, 10h52
  3. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h22
  4. [Procédure Stocké] Quand utiliser ?
    Par touhami dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h09
  5. Utilisation de Pointeurs dans API windows
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 13/03/2003, 22h39

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