C++ : Les pointeurs intelligents

Découvrir le pointeur faible : weak_ptr

TESTEZ LINKEDIN LEARNING GRATUITEMENT ET SANS ENGAGEMENT

Tester maintenant Afficher tous les abonnements
Le pointeur à référence faible est très utile à connaître et à utiliser. Il permet de matérialiser des dépendances ponctuelles ou circulaires entre objets.

Transcription

Le pointeur faible ou weak pointer est un pointeur un peu particulier dans la famille des pointeurs intelligents. Il ne gère pas la libération de la ressource, il le délègue au shared pointer avec qui il travaille. Alors pour voir l'utilisation et l'utilité du weak pointer, on va devoir passer par les pointeurs shared le pointeur partagé a donc ici, et créé avec make_shared qu'on a vu précédemment et qui créé une ressource "Contenu". Cette ressource on va aussi la faire gérer par d'autres pointeurs partagés, b, c, d et e. Donc on a au moment où on exécute et on affiche le nombre de références cinq références qui sont celles de a, b, c, d et e sur 'Contenu'. Là où ça devient intéressant, c'est lorsque l'on créé un pointeur faible ici w, et que l'on affecte le pointeur partagé a. Donc notre pointeur faible va référencer la ressource désignée par a. À ce moment là, le pointeur faible n'augmente pas le nombre de références à notre ressource comme on le voit ici, on est toujours à cinq références même après la création du weak pointer. Par contre ce nombre de références augmente lorsqu'on utilise le pointeur weak. Alors on l'utilise au travers de clog_weak, on va regarder ce qui se passe dans cette fonction, voilà cette fonction fait un lock pour pouvoir manipuler la ressource désignée par le weak pointer, on le met dans tmp, tmp va exister le temps de cette fonction clog_weak et disparaître à la fin lorsque l'on afffichera donc le nombre de références à la ressource on en aura une de plus, on va le voir tout à l'heure. Avant on regarde un peu ce qu'il y a d'intéressant dans le code qu'on a mis ici. On teste quand même tmp puisque la ressource peut ne plus exister au moment où on la lock auquel cas ce sera null et il faut surtout pas essayer d'utiliser tmp, ou si il n'est pas null ce qui est le cas nous dans le premier exemple, on a l'affichage du contenu tmp-val, on affiche ici et le nombre de références donc qu'on affiche ici : 6 références dont tmp. Par contre si on diminue le nombre de références a, b, c et d ici on les reset donc on n'a plus que e qui fait référence à notre ressource, et ben on va voir une seule référence à notre ressource et lorsqu'on fera le clog_weak qui est là on a deux références bien sûr le temps de créer tmp. Enfin dans le dernier cas, lorsque l'on reset le dernier pointeur partagé e là on n'a plus aucune ressource qui référence donc on a le destructeur chaine qui est appelé, et lorsque l'on essaye d'utiliser dans clog_weak notre weak pointer, ben ici notre test tmp nous permet d'afficher null et on n'a aucune référence à la ressource, la ressource a disparu, notre weak pointer nous permet de le savoir. Ce qui n'est pas le cas sur les pointeurs classiques. Donc maintenant, dans quel cas et dans quel type de programme il est intéressant d'utiliser un weak pointer ? Prenons le cas d'un programme qui manipule les objets 'Manager' et 'Employé'. L'objet 'Manager' garde une trace de tous les 'Employés' qu'il gère au travers de pointeurs partagés, et l'objet 'Employé' garde une trace aussi du 'Manager' au travers d'un pointeur partagé. Cette conception qui semble évidente pose un problème. Quand est-ce que je vais pouvoir libérer mes deux ressources ? En effet, la ressource 'Employé' ne sera libérée que si il n'y a plus de référence à la ressource 'Employé', et la ressource 'Manager' ne sera libérée que quand il n'y aura plus de référence à la ressource 'Manager'. Or, l'Employé garde une trace du Manager dont il créé une référence, le Manager garde une trace des Employés donc ce qui créé une ou plusieurs références. Aucun des deux ne passera jamais à zéro référence et donc ne sera jamais libéré. On a typiquement un problème de référence circulaire. Pour résoudre ce problème, je vais introduire sur une des deux ressources un weak pointer. Ainsi donc le nombre de références ne sera pas comptabilisé sur un des deux objets, ici le Manager donc le Manager ne va pas ajouter de références aux Employés. Les objets Employés peuvent donc être libérés lorsqu'il n'y aura plus de références et parce qu'ils sont libérés, ils n'entretiennent plus de références non plus au Manager qui lui aussi pourra être libéré. Le weak pointer s'avère donc très utile dans le cas des références circulaires il peut l'être aussi dans d'autres cas.

C++ : Les pointeurs intelligents

Utilisez les pointeurs intelligents et gérez efficacement vos ressources et allocations de mémoire en C++. Choisissez le type de pointeur intelligent en fonction de vos besoins.

29 min (9 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :24 oct. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !