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

Langage C++ Discussion :

Gestion de pointeur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Gestion de pointeur
    Hello,

    Disons que vous avez une fabrique qui doit instancier un objet.
    Le pointeur renvoyé va avoir plusieurs utilisateurs.

    L'appelant de la fabrique devra gérer la durée de vie du pointeur, et tous les autres utilisateurs de ce pointeur auront toujours une durée de vie plus courte.

    Quel type de pointeur utilisez-vous ?

    J'aurais tendance à ce que la fabrique renvoie un unique_ptr, qui sera détenu par l'appelant, et que les autres utilisateurs y aient simplement accès par un pointeur brut. Mais rien n'empêcherait ces derniers de faire un delete dessus...

    La shared_ptr ma chagrine, car la gestion de la durée de vie est partagée, ce qui ne correspond pas au cas d'utilisation.

    Le weak_ptr impose de créer un shared_ptr à chaque utilisation.

    Que faites-vous, dans ce cas là ?

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    L'objectif est d'utiliser les types des entrées et sorties de chaque fonction pour expliciter qui est propriétaire et manager d'une ressource.

    Définissons dans un premier temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Une ressource devant être managée
    struct Object {};
    Nous parlons ensuite d'une factory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Une Factory à Object. Puisqu'elle retourne un unique_ptr, elle explicite que l'appelant est propriétaire de la mémoire qu'elle alloue.
    std::unique_ptr<Object> factory() { return std::make_unique<Object>(); }
    (ne pas oublier d'#include <memory>)

    Son appelant est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Un manager d'Object. En appelant factory(), il se désigne comme propriétaire de la mémoire et manager de la ressource.
    void owner()
    {
        auto object = factory();
        user(*object);
    }
    Ici, en ignorant tous les commentaires, un lecteur comprendra simplement par les types en question qui manage quoi :
    • factory alloue mais laisse à l'appelant le soin de libérer la mémoire, bien que tout soit automatiquement fait par RAII (std::unique_ptr) ;
    • owner en tant qu'appelant manage la ressource et laisse user y accéder soit par valeur, soit par référence, soit par référence constante ;
    • user n'est clairement pas propriétaire ou manager de la mémoire d'object.


    On peut donc par exemple définir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Une utilisation non propriétaire d'un Object. Puisque cette fonction prend une référence (const ?), il est explicite qu'elle ne peut pas être manager de cette ressource.
    void user(const Object&) {}
    Code complet et démo en live sur coliru.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En faisant fi de l'intérêt d'avoir un pointeur sur un entier (imaginons plutôt un pointeur vers une classe de base d'une hiérarchie), le code suivant serait-il le modèle à suivre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Foo
    {
    public:
        Init() {...}   // initialise toto
        const int& GetToto() { return *toto; }
    private:
        std::unique_ptr<int> toto;
    };

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Pourquoi pas unique_ptr interne à l'appelant qui offre un accès à l'objet par référence ? Si retourner un pointeur te fait peur (ce qui ne devrait pas être le cas).
    Et si tu me sors le "risque que quelqu'un fasse un delete &ref;" sur la référence : autant ne rien faire, y'a pas de solution si les utilisateurs font juste absolument n'importe quoi.

    edit: oui exactement ton code ci-dessus
    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.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    OK, vendu.

    Merci à tous !

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ceci dit, il n'y a a priori aucune raison pour que ce soit la fabrique qui soit propriétaire de la ressource qu'elle crée: le role de la fabrique, c'est de créer la ressource, point-barre. Si tu commences à donner plus de responsabilités à la fabrique, tu ne vas pas tarder à la nommer manager, et, comme c'est un terme qui ne veut rien dire tellement il a de significations, tu finiras rapidement avec une classe monolithique que tu auras peur de regarder de trop près, et plus peur encore d'essayer de modifier.

    L'idéal est donc au moins de séparer ce qui construit de tes ressources de ce qui les maintient en mémoire

    Après, l'idéal est toujours de garder un propriétaire unique et clairement identifié pour tes ressources. Tu le dis d'ailleurs toi-même: tu as plusieurs utilisateurs, mais tu veux que ta fabrique soit la seule à en gérer la durée de vie.

    Si on prend la remarque que je viens de faire en compte, on ne fait que transposer le fait que c'est ce qui maintient les ressources en mémoire qui s'occupe de gérer leur durée de vie

    Et, dans ce cas, l'utilisation d'un std::unique_ptr est totalement justifiée. Libre à toi de décider de permettre aux utilisateurs des ressources d'y accéder sous forme de référence (ce qui sera toujours préférable) ou sous forme de pointeur nu, en faisant bien attention au fait que la présence d'un pointeur nu est alors synonyme de non propriété
    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

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

Discussions similaires

  1. Gestion de pointeurs
    Par fogan dans le forum Débuter
    Réponses: 2
    Dernier message: 28/10/2012, 12h35
  2. une mauvaise gestion de pointeur ?
    Par SergioMaster dans le forum Débuter
    Réponses: 8
    Dernier message: 19/04/2012, 09h34
  3. gestion du pointeur
    Par dido1987 dans le forum Débuter
    Réponses: 15
    Dernier message: 10/05/2011, 17h27
  4. Gestion des pointeurs
    Par koukiya dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2008, 01h08
  5. Problème avec str_sub et gestion des pointeurs
    Par toine44 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/06/2008, 15h30

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