Voici une citation de la section des notes d'implémentation de cppreference de std::shared_ptr
, qui mentionne qu'il existe deux pointeurs différents (comme indiqué en gras) : celui qui peut être retourné par get()
, et celui qui contient les données réelles dans le bloc de contrôle.
Dans une implémentation classique,
std::shared_ptr
ne contient que deux pointeurs :
- le pointeur stocké (celui retourné par
get()
)- un pointeur vers le bloc de contrôle
Le bloc de contrôle est un objet alloué dynamiquement qui contient :
- soit un pointeur vers l'objet géré, soit l'objet géré lui-même
- le destructeur (effacé par le type)
- l'allocation (effacée par le type)
- le nombre de
shared_ptrs
possédant l'objet géré- le nombre de
weak_ptrs
faisant référence à l'objet géréLe pointeur détenu par le
shared_ptr
directement est celui retourné parget()
, tandis que le pointeur ou l'objet détenu par le bloc de contrôle est celui qui sera supprimé lorsque le nombre de propriétaires partagés atteint zéro. Ces pointeurs ne sont pas nécessairement égaux.
Ma question est, pourquoi deux pointeurs différents (les deux en gras) sont-ils nécessaires pour l'objet géré (en plus du pointeur vers le bloc de contrôle) ? Le pointeur retourné par get()
ne suffit-il pas ? Et pourquoi ces pointeurs ne sont-ils pas nécessairement égaux ?
0 votes
IIUC cela implique qu'il existe en réalité, potentiellement au moins, trois pointeurs impliqués: 1. Quelque chose retourné par get(); 2. Potentiellement un pointeur à l'intérieur du bloc de contrôle vers l'objet qui sera éventuellement supprimé; 3. Un pointeur vers le bloc de contrôle. Deux d'entre eux sont détenus par le ptr partagé proprement dit; le troisième réside à l'intérieur du bloc de contrôle.
0 votes
Ceci est une question différente, comme je l'ai souligné dans mon commentaire précédent. Il ne concerne pas le bloc de contrôle par rapport à l'objet mais le fait qu'il y a deux pointeurs vers "l'objet" qui peuvent même être différents (ou il n'y aurait pas besoin d'en avoir deux). De plus le pointeur vers le bloc de contrôle. (Et la réponse semble avoir à voir avec le constructeur shared_ptr d'aliasing).
0 votes
De ce que je comprends, la réponse sur stackoverflow.com/a/26351926 concerne la différence entre les deux méthodes de construction, mais n'explique toujours pas pourquoi deux allocations potentiellement différentes sont nécessaires en premier lieu.
1 votes
@PeterA.Schneider D'accord, j'ai trouvé la question confuse et ambiguë. Elle pourrait certainement demander quelque chose de différent de ce que je pensais.