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 :

Explication de weak_ptr


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Points : 143
    Points
    143
    Par défaut Explication de weak_ptr
    Bonjour,

    Je suis un cours sur les pointeurs intelligents en C++ malheureusement la partie sur weak_ptr n'est pas très explicite, j'ai pas compris, j'ai cherché sur internet je ne trouve pas d'explication.
    Est-ce que quelqu'un peut m'expliquer le fonctionnement des weak_ptr?

    Merci d'avance,

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    std::weak_ptr marche en tandem avec std::shared_ptr.
    Tu peux créer un weak_ptr à partir d'un shared_ptr.
    Si le shared_ptr existe toujours, tu peux ensuite récupérer un shared_ptr à partir du weak_ptr.
    https://www.cplusplus.com/reference/memory/shared_ptr/
    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.

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

    Pour compléter la réponse de bousk...

    Un shared_ptr va travailler (je simplifie) avec un "comptage de références":

    Chaque fois qu'un shared_ptr est créé, ce compteur de référence est incrémenté, chaque fois qu'un shared_ptr est détruit (parce que l'on sort de la portée dans laquelle il a été déclaré), le compteur de références est décrémenté.

    Lorsque le compteur de références atteint la valeur de 0, l'adresse mémoire représentée par le pointeur sous-jacent est libérée et rendue au système.

    Bon, il est très bien ce principe, mais on peut trouver "tout un tas" de raisons pour ne pas être "trop pressé" d'incrémenter ce comptage de références, par exemple, en faisant en sorte qu'il ne soit incrémenté que... lorsque l'on va réellement essayer d'accéder au pointeur sous-jacent, de manière à permettre la libération de la mémoire allouée au pointeur sous-jacent "le plus tôt possible".

    Mais, du coup, il faut "un autre type" (qui ne peut pas être nommé shared_ptr) pour "contenir" l'adresse du pointeur sous-jacent sans incrémenter le compteur de références. Et cet "autre type" a été nommé weak_ptr.

    Cela va donc nous permettre de travailler sous une forme qui serait proche de
    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
    18
    19
    20
    /* Soit un tableau  de weak_ptr sur un type T proche de
    std::vector<std::weak_ptr<T>> tabWeaks;
     
    /* et "quelque part", nous parcourrons le tableau en n'incrémentant le compteur
     * de référence que  si c'est vraiment nécessaire et que pour un temps strictement
     * indispensable:
     */
    for(auto & weak : tabWeaks){
        if(condition){
            std::shared_ptr<T> locked{weak}; // incrémente le comptage de référence
            /* je peux utiliser locked en étant sûr que la mémoire allouée
             * au pointeur sous-jacent ne sera pas libérée "par erreur".
             */
        } /* locked est détruit, vu qu'on sort de sa portée
            * et, s'il s'agit de la dernière référence au  pointeur
            * sous-jacent -- parce que l'on est dans un contexte 
            * multi thread, ou que sais-je --, la mémoire allouée à
            *  celui-ci pourra être libéré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

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Points : 143
    Points
    143
    Par défaut
    Merci de vos réponses

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

Discussions similaires

  1. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34
  2. pointeurs (explications)
    Par isidore dans le forum C
    Réponses: 4
    Dernier message: 18/04/2003, 10h41
  3. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  4. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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