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 shared_array, shared_ptr et weak_ptr


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut Pointeurs intelligents shared_array, shared_ptr et weak_ptr
    Bonjour,

    Petit souci certainement basique avec les pointeurs intelligents.

    Sans pointeurs intelligents, j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A {
      Array *array;
    public:
      A(){
        array = new Array[N];
        for(unsigned int i = 0 ; i < N ; i++)
          array[i] = Array(this);
      }
    };
    Avec pointeurs intelligent, je fais comment ?? Parce que finalement, Array(this), this devrait être un weak_ptr, sinon, on a un problème de référence cyclique non ?
    Je veux dire, si j'utilise un shared_ptr<A> pour chaque Array, comme j'ai de l'autre côté un shared_array<Array> ça ne marchera pas, non ?

    Et inversement, si je veux un weak_ptr<A> pour chaque Array, il me faut un shared_ptr<A> à la base ? Or celui-ci devrait être créé en amont, en dehors du constructeur A.

    Bref. Un peu perdu sur ces questions.

    Merci!

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    D'une, tu peux utiliser std::vector à la place de ton tableau dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
      std::vector<Array> array;
    public:
      A() {
        array = std::vector<Array>(N, Array(this));
      }
    };
    De deux, on peut en général utiliser enable_shared_from_this, qui permet de récupérer un shared_ptr<A> valide sur this... sauf qu'il n'est pas possible de l'utiliser dans le constructeur.

    Sans enable_shared_from_this, une alternative est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A {
      std::vector<Array> array;
      std::weak_ptr<A> self;
    public:
      A() {
      }
     
      void setSelf(std::weak_ptr<A> s) {
        self = s;
        array = std::vector<Array>(N, Array(self));
      }
    };
    ... où setSelf doit être appelé après chaque construction de A.
    Tu peux alors éventuellement encapsuler ce comportement dans une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class B {
      std::shared_ptr<A> a;
    public :
      B() {
        a = std::shared_ptr<A>(new A());
        a->setSelf(a);
      }
     
      // Permet d'utiliser B comme un pointeur sur A,
      // alternative à une fonction GetA().
      std::shared_ptr<A> operator -> () {
        return a;
      }
    };
    Ou alternativement, de façon à être plus sûr de ne pas faire de bêtises :
    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
    class A {
      A() {}
     
      void setSelf(std::weak_ptr<A> s) {
        self = s;
        array = std::vector<Array>(N, Array(self));
      }
     
      std::vector<Array> array;
      std::weak_ptr<A> self;
    public:
      static std::shared_ptr<A> create() {
        std::shared_ptr<A> a(new A());
        a->setSelf(a);
        return a;
      }
    };
    S'il existe déjà une solution toute faite, je ne la connais pas.

Discussions similaires

  1. delete [] et pointeur intelligent
    Par zenux dans le forum C++
    Réponses: 11
    Dernier message: 04/12/2006, 09h18
  2. Les pointeurs intelligents
    Par MatRem dans le forum C++
    Réponses: 8
    Dernier message: 20/06/2006, 19h27
  3. pointeur intelligent??
    Par yashiro dans le forum C++
    Réponses: 3
    Dernier message: 04/04/2006, 08h08
  4. 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