Pourquoi l'objet de comptage de référence de ptr partagé doit garder une trace du nombre de PTR faibles pointant vers l'objet aussi?

Salut, je suis à la lecture par le biais de ce document et certains autres documents sur le C++shared_ptr et ils ont tous l'air de suggérer que, hormis le nombre de shared_ptr pointant vers l'objet alloué, l'objet reference count doit garder une trace de combien weak_ptr pointeur pointant sur l'objet. Ma question est pourquoi? De ma compréhension, weak_ptr n'est pas propriétaire donc si le compte de shared_ptr pointant vers l'objet atteint zéro, l'objet peut être supprimé. C'est pourquoi, parfois, nous avons besoin d'utiliser expiré pour vérifier la disponibilité d'un objet pointé par un weak_ptr. Pourriez-vous expliquer la raison pour laquelle il est nécessaire de suivre le nombre de weak_ptrs?

Pourquoi avons-nous besoin d'un faible compte ici? enter image description here

16
demandé sur dorafmon 2017-07-19 22:59:09
la source

3 ответов

std::weak_ptr désigne le bloc de contrôle de savoir si l'objet existe toujours et, dans l'affirmative, fournir un std::shared_ptr en cas de besoin. Pour cette raison, le bloc de contrôle doit exister aussi longtemps que un std::weak_ptr et std::shared_ptr existe. Vous devez suivre le nombre de cas de std::weak_ptr pour savoir quand le dernier est détruit, tout comme pour les std::shared_ptr.

21
répondu François Andrieux 2017-07-19 23:04:42
la source

shared_ptr nombre de références est le nombre de propriétaires de l'objet. weak_ptr le comptage de référence est le comptage des propriétaires du bloc de contrôle du comptage de référence.

5
répondu Billy ONeal 2017-07-19 23:02:42
la source

ajoutant à la réponse de François Andrieux:

il y a un effet secondaire très important à comprendre.

si vous utilisez une implémentation de std:: make_shared qui utilise l'optimisation WKWYL (nous savons où vous habitez) de l'allocation du bloc de contrôle et de l'objet réel ensemble comme une seule allocation contiguë, la mémoire ne sera libérée qu'après que tous les objets weak_ptr soient sortis de leur portée.

(mon compte est rarement utilisé, donc je impossible d'ajouter des commentaires, en raison de ne pas avoir assez de points de réputation, ajoutant ainsi une réponse plutôt qu'un commentaire)

3
répondu Rex Kerr 2017-07-31 21:17:25
la source

Autres questions sur c++ c++11 shared-ptr weak-ptr