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 :

Pointeurs intelligents vs. pointeurs bruts


Sujet :

C++

  1. #1
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut Pointeurs intelligents vs. pointeurs bruts
    Bonjour à tous.

    Ma question est très simple. Peut-on aujourd'hui se passer des pointeurs bruts dans nos codes et les remplacer par des pointeurs intelligents dans tous les cas ?
    Il me semble, a priori, que si l'on accepte le petit surcout alors c'est toujours possible.

    Si non, qu'est-ce qui nous empêche de le faire ? Avez-vous un exemple concret ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 70
    Points : 88
    Points
    88
    Par défaut
    Si Truc* CreerTruc( void* p ) créé un objet de classe truc (new Truc) qui garde caché dans sa manche un pointeur sur p, et que tu lui passes un "smart pointer", alors tu as une référence cachée qui traîne, non comptabilisée par ton smart pointer...

    Donc, dans tes codes, pourquoi pas, mais dans les codes des autres, attention.

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Une autre chose est que la copie d'un pointeur intelligent "auto_ptr" dé-référence l'original. L'auto_ptr ne répond pas toujours à ce que tu désires.
    Homer J. Simpson


  4. #4
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Quand je parle de pointeurs intelligents, je pensais à ceux de boost. En prenant soin de toujours choisir le plus adapté.

  5. #5
    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,

    De manière générale, il est au minimum plus sécurisant d'utiliser les pointeurs intelligents que les pointeurs bruts.

    Le temps d'apprentissage est, bien sur, plus important, ne serait-ce que parce qu'il faut commencer par apprendre les différences qui existent entre les différentes possibilités et ce que celles-ci permettent, mais cet investissement est généralement très rapidement amorti en t'économisant énormément de temps de débugage à te demander où se trouve la fuite mémoire ou l'invalidation d'un pointeur, si tu moins, tu choisi... intelligemment tes pointeurs intelligents

    Il est, bien sur, possible de s'en passer, mais cela nécessite une politique stricte de la gestion de la mémoire, une conception sans faille et une confiance absolue dans l'équipe de développement.

    Je dirais volontiers que plus le projet ou l'équipe devient important(e), plus tu as du "turn over" dans l'équipe, plus la nécessité d'utiliser les pointeurs intelligents se fera sentir
    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

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    on peut aussi ne pas utiliser de pointeurs :o

  7. #7
    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 Joel F Voir le message
    on peut aussi ne pas utiliser de pointeurs :o
    On peut, en tout cas, en restreindre énormément l'utilisation, c'est un fait...

    Mais il y a certaines situations dans lesquelles leur usage représente, si pas la seule solution, au moins la "moins mauvaise".

    C'est à ce moment que l'intérêt des pointeurs intelligents se fera d'autant plus sentir, parce que l'utilisation des pointeurs devient, justement, plus ou moins exceptionnelle et donc... moins maitrisée
    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

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Joel F Voir le message
    on peut aussi ne pas utiliser de pointeurs :o
    Globalement difficile quand même.
    A partir d'un projet de taille moyenne, on a rapidement une variable membre qui ne peut pas être initialisée à la création et on met un pointeur (intelligent).
    Il y a aussi le cas de la responsabilité partagée (ça arrive plus souvent qu'on croit et ça évite d'avoir un méga manager pour toutes les ressources).

    D'accord avec toi que les références c'est mieux quand on peut.

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par poukill Voir le message


    D'accord avec toi que les références c'est mieux quand on peut.
    Pourquoi ?

  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
    Citation Envoyé par guillaume07 Voir le message
    Pourquoi ?
    Pour de nombreuses raisons:
    • Les références utilisent une syntaxe identique
    • Les références respectent beaucoup plus facilement la constance
    • Les références force l'existence de l'objet référencé
    • Les pointeurs sont, classiquement, associés à l'allocation dynamique de la mémoire, avec tous les risques que cela peut comporter
    • Toutes celles qui ne me viennent pas forcément en tête à cause de l'heure
    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
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par koala01 Voir le message
    [*]Les références force l'existence de l'objet référencé[/LIST]
    et si on initialise la référence sur un pointeur et qu'on delete le pointeur ?

  12. #12
    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 guillaume07 Voir le message
    et si on initialise la référence sur un pointeur et qu'on delete le pointeur ?
    Généralement, les références sont utilisées en tant qu'argument à une fonction...

    La logique utilisée si l'on fournit "ce qui est pointé" par un pointeur lors de l'appel d'une fonction, la libération de la mémoire allouée au pointeur n'interviendra, forcément, qu'après exécution complète de la fonction appelée

    Un exemple pour te permettre de comprendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* Soit la fonction */
    void foo(Type & ref)
    {
        /* on est sur que ref fait bel et bien référence à un objet qui existe */
    }
    int main()
    {
        Type * ptr= new type;
        /* on transmet ce qui est pointé par ptr */
        foo( *ptr);
        /* il n'y a aucun problème à détruire ptr ici, foo a fini de s'exécuter */
        delete ptr;
    }
    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

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    exact!

  14. #14
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Oui donc pour quelqu'un qui débuterait, l'apprentissage utilisation de pointeurs nus n'aurait aucun intérêt.
    Et même l'utilisation de pointeurs (intelligents) peut être retardée jusqu'à l'introduction du concept de polymorphisme et de collection hétérogène ainsi que pour ce qui est de l'allocation dynamique.

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Nanoc Voir le message
    Oui donc pour quelqu'un qui débuterait, l'apprentissage utilisation de pointeurs nus n'aurait aucun intérêt.
    Je trouve ça un peu extrême. Il est certain que je ne commencerais pas par là, mais ça a quand même sa place je trouve dans un cours pour débutants.
    Citation Envoyé par Nanoc Voir le message
    Et même l'utilisation de pointeurs (intelligents) peut être retardée jusqu'à l'introduction du concept de polymorphisme et de collection hétérogène ainsi que pour ce qui est de l'allocation dynamique.
    C'est à peu près à ce moment là que je les introduits. Et juste après avoir introduit les pointeurs nus, je leur montre comment ils peuvent poser des problèmes, et comment les pointeurs intelligents peuvent gérer ces problèmes.
    Mais je passe quand même par l'étape pointeurs nus. Simplement parce que la notion d'une variable qui référence une zone mémoire n'est pas si simple pour tout le monde, et qu'en terme de progression, il me semble utile d'y aller doucement avant d'introduire les notions supplémentaires de responsabilité (éventuellement partagée) de la durée de vie d'une variable, et les mécanismes permettant de gérer cette responsabilité.

    Donc, en gros, mon cours fait pointeurs, constructeurs de copie/operateur=, pointeurs intelligents.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre régulier

    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 114
    Points
    114
    Par défaut
    Oui c'est bien à ça que je pensais.

    Et sinon, à part dans l'interfaçage avec des trucs de C qui allouent sans prèvenir, est-ce qu'il y a d'autres limitations ??

  17. #17
    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 Nanoc Voir le message
    Oui donc pour quelqu'un qui débuterait, l'apprentissage utilisation de pointeurs nus n'aurait aucun intérêt.
    Et même l'utilisation de pointeurs (intelligents) peut être retardée jusqu'à l'introduction du concept de polymorphisme et de collection hétérogène ainsi que pour ce qui est de l'allocation dynamique.
    Je rejoins (un peu tard) l'avis de Loic...

    Les pointeurs nus sont malgré tout un passage obligé, ne serait-ce que parce qu'il faut au moins en avoir saisi le principe avant de vouloir expliquer celui des pointeurs intelligents.

    On pourrait d'ailleurs très facilement scinder les explications sur les pointeurs en deux temps:
    • Dans un premier temps, se contenter de dire ce que c'est, afin de permettre (c'est parfois nécessaire ) de référencer le contenant dans le contenu
    • Dans un deuxième temps expliquer leur utilisation dans l'allocation dynamique de la à but de polymorphisme.
    Les pointeurs intelligents arrivant, oserais-je écrire fatalement , comme solution aux problèmes que peuvent poser les pointeurs nus face à l'allocation dynamique de la mémoire

    Et puis, il faut aussi apporter une certaine tempérance en fonction du contexte:

    Au risque de paraître bien modeste, la maitrise que j'ai des pointeurs, et le haut niveau ma conception et de ma logique fait que je suis sur de travailler correctement avec des pointeurs nus.

    Pour un projet d'application tout à fait personnel, je ne me forcerai pas vraiment à utiliser les pointeurs intelligents

    Par contre, pour un projet personnel de bibliothèque, qui sera susceptible d'être utilisée par d'autres, ou pour un projet d'équipe, je sortirai les pointeurs intelligents si vite que tu n'auras pas le temps de dire ouf, simplement, parce que je ne serai plus dans une situation dans laquelle je peux assurer la qualité de ce qui est fait.

    On ne peut obliger personne, lors d'une discussion générale comme celle-ci à utiliser les pointeurs intelligents, et tu remarqueras d'ailleurs qu'on a bien évité de le faire .

    Par contre, il est important de te donner les informations qui te permettront de prendre ta décision "en connaissance de cause".

    Le meilleur moyen d'y arriver est de te parler, comme je l'ai fait, des avantages, des inconvénients et des risques de chaque méthode .
    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

  18. #18
    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 Nanoc Voir le message
    Oui c'est bien à ça que je pensais.

    Et sinon, à part dans l'interfaçage avec des trucs de C qui allouent sans prèvenir, est-ce qu'il y a d'autres limitations ??
    L'allocation, c'est encore le moindre mal...

    Ce qui fait tout de suite beaucoup plus de mal, c'est une désallocation sans prévenir.

    D'une certaine manière, si tu refais un new sur un pointeur pour lequel la mémoire a déjà été allouée dynamiquement, " tout ce que tu risque" , c'est une fuite mémoire.

    Ce n'est pas bien, c'est mauvais pour le système, mais, au vu des systèmes actuels, tu peux encore avoir une certaine tolérance par rapport à cela (comprend moi: je ne dis pas qu'il ne faut pas s'en faire, je remarque simplement qu'il faut déjà perdre souvent la référence à une adresse mémoire ou allouer de grosses quantités de mémoire avant de mettre le système en péril )

    Par contre, la libération de la mémoire allouée dynamiquement sans avoir la certitude que tous ceux qui disposent de l'adresse soient bien tenus au courent va se payer très cher et comptant: toute tentative d'accès à l'adresse après la libération, ou de nouvelle libération de la mémoire, enverra le programme cueillir les pâquerettes, avec plantage quasi immédiat de l'application (dans le meilleur des cas).

    Tout ce qui pourra éviter de se trouver dans ce genre de situation sera donc réellement le bienvenu
    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

  19. #19
    Membre actif

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Points : 206
    Points
    206
    Par défaut
    Personnellement, j'utilise beaucoup les pointeurs nus dans le "fouillis interne" de ma classe : Dans ce qui est public, pas de pointeurs mais dans tous ce qui est interne à une classe, j'utilise presque exclusivement les pointeurs nus.
    Les pointeurs intelligents, sont tout de même conseillé lors de fonctions non membre et quand les performances ne sont pas cruciales.
    De plus, j'aurais tendance à dire, que moins on est à travailler sur un projet, plus on peut se permettre les pointeurs nus.

  20. #20
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    Les pointeurs intelligents, sont tout de même conseillé lors de fonctions non membre et quand les performances ne sont pas cruciales.
    Pas d'accord du tout. La pénalité de performance est extrêmement faible. Tu l'as déjà mesurée ? C'est l'impleméntation d'un compteur de référénce pour le shared_ptr.

    De plus, j'aurais tendance à dire, que moins on est à travailler sur un projet, plus on peut se permettre les pointeurs nus.
    Euh... Perso je suis souvent tout seul, et les shared_ptr sont mes amis. Non seulement, j'arrive rapidement à garantir un minimum d'exception safety dans mes classes, mais j'arrive aussi à écrire presque du premier coup un code qui marche, et sans fuite mémoire. Dans un code avec plus de 100 000 lignes, auquel il faut ajouté la dépendance à une dizaine de librairies, le tout baignant dans les exceptions (c'est bien là le fond du problème), va jouer là dedans avec des pointeurs tout nus !
    Le sujet a déjà été largement traité, je vais pas me répéter, mais un coup d'oeil dans un bon bouquin du genre Exceptional C++, et tu vas les aimer les pointeurs intelligents.

Discussions similaires

  1. Réponses: 55
    Dernier message: 18/03/2014, 12h11
  2. Réponses: 13
    Dernier message: 27/04/2012, 16h03
  3. Les pointeurs intelligents
    Par MatRem dans le forum C++
    Réponses: 8
    Dernier message: 20/06/2006, 19h27
  4. pointeur intelligent??
    Par yashiro dans le forum C++
    Réponses: 3
    Dernier message: 04/04/2006, 08h08
  5. Pointeur intelligent boost : return NULL ->comment faire?
    Par choinul dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 21/12/2005, 16h24

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