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 :

quel pointeur intelligent choisir?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut quel pointeur intelligent choisir?
    Bonjour à tous,

    j'avoue mon inculture crasse en ce qui concerne les pointeurs intelligents. Je viens donc vous demander conseil.

    Voilà, j'ai un petit programme dans lequel j'ai 2 instances d'objets assez lourds. Je vais avoir besoin d'utiliser ces 2 objets dans mon programme, mais sans les modifier, et sans faire de copie. Il me faut donc un pointeur. Oui car en plus, j'ai besoin d'avoir le cas ou mon pointeur vaut NULL.

    Il me faut donc un pointeur intelligent qui:
    . N'a aucune relation de "propriété" sur l'objet pointé
    . Peut être NULL

    Quel est, à votre avis, celui qui convient le mieux?

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Le seul pointeur intelligent que je connaisse qui n'as aucune relation de propriété sur l'objet pointé, c'est le weak_ptr. Ça implique que ton objet doit être géré par shared_ptr.

  3. #3
    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 : 50
    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
    Par défaut
    Je ne suis pas certain de bien te suivre...

    Comment sont créés ces objets ? Sur le pile ou sur le tas ?
    Quelle est la relation entre la durée de vie des objets et celle des pointeurs ? Qu'est-il sensé se passer si l'objet est détruit alors que tu pointes encore dessus ?
    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.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Comment sont créés ces objets ? Sur le pile ou sur le tas ?
    Pour l'instant, ils sont créés sur la pile. Mais ce n'est pas une contrainte, s'il le faut, je peux les créer sur le tas.

    Citation Envoyé par JolyLoic Voir le message
    Quelle est la relation entre la durée de vie des objets et celle des pointeurs ? Qu'est-il sensé se passer si l'objet est détruit alors que tu pointes encore dessus ?
    Normalement, cela ne devrait jamais arriver. Ils sont créés par un singleton (dit autrement: ils appartiennent à ce singleton) qui sera libéré en dernier dans le programme. Mais dans l'absolu, si ça arrive, il ne devrait rien se passer, car en fait, à chaque fois que je vais utiliser ces pointeurs, je vais vérifier qu'ils sont valide ( pour l'instant != NULL ).
    En gros, ces pointeurs peuvent avoir 3 états: pointer sur l'objet 1, pointer sur l'objet 2 ou NULL.

  5. #5
    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 : 50
    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
    Par défaut
    Donc tu as deux objets dont la durée de vie est celle du programme, et tu veux pointer dessus ? Je ne vois pas trop quel service supplémentaire pourrait t'apporter un pointeur intelligent ici, à part éventuellement :
    - Vérifier en debug que tu pointes bien sur un de ces objets, ou NULL.
    - Vérifier en debug que tu n'utilise plus un de ces objets après l'avoir détruit (par exemple depuis le destructeur d'un objet global)

    Mais franchement dans ton cas, un simple pointeur me semble une bonne solution.
    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.

  6. #6
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Si tu veux éviter le partage de propriété, le weak_ptr me semble ce qu'il te faut ici.

    weak_ptr<T>.lock() te renvoi un shared_ptr< T > valide si le pointé existe toujours, sinon shared_ptr< T >().

    D'ailleurs, je crois que tu ne le sais pas quand je te lis, mais tous les pointeurs intelligents peuvent pointer sur NULL (bien que ça n'ait pas exactement la même utilité que les pointeurs nus).

    En réalité, un pointeur intelligent "ne pointant pas", c'est un pointeur intelligent default-initialisé, ou en d'autres mots, shared_ptr< T >().

    D'ailleurs, tu peux le tester, il est bool convertible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    shared_ptr< T > sp;
    bool b = sp; // b = false
    bool b = ( sp == shared_ptr< T >() ); // true

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Donc tu as deux objets dont la durée de vie est celle du programme, et tu veux pointer dessus ? Je ne vois pas trop quel service supplémentaire pourrait t'apporter un pointeur intelligent ici, à part éventuellement :
    - Vérifier en debug que tu pointes bien sur un de ces objets, ou NULL.
    - Vérifier en debug que tu n'utilise plus un de ces objets après l'avoir détruit (par exemple depuis le destructeur d'un objet global)

    Mais franchement dans ton cas, un simple pointeur me semble une bonne solution.
    Ha ben là, ce que tu dis me rassure énormément. Parce qu'en fait, je ne voyais pas trop l'avantage que je pouvais obtenir en utilisant un pointeur intelligent. Mais comme il est généralement recommandé de ne pas utiliser des pointeurs nus, je ne savais pas trop qu'en penser.

Discussions similaires

  1. Réponses: 55
    Dernier message: 18/03/2014, 12h11
  2. [JAVA] Quel EDI JAVA choisir pour Mac OS X ?
    Par didi dans le forum Développement OS X
    Réponses: 18
    Dernier message: 29/09/2007, 22h07
  3. [Débutant] Quel objet dialogue choisir ???
    Par Walm dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/01/2004, 14h40
  4. quel plugin UML choisir ?
    Par sebouhou dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 30/10/2003, 18h49

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