D'abord jeter un oeil à ce que le C++ Primer dit à propos de unique_ptr
et shared_ptr
:
$16.1.6. L'efficacité et la Flexibilité
Nous pouvons être certains qu'
shared_ptr
ne tient pas la deleter en tant que membre direct, parce que le type de la deleter n'est pas connu jusqu'à l'exécution.Parce que le type de la deleter fait partie du type de
unique_ptr
, le type de la deleter membre est connu au moment de la compilation. La deleter peuvent être stockés directement dans chaqueunique_ptr
objet.
Il semble donc que l' shared_ptr
n'ont pas un membre direct de la deleter, mais unique_ptr
n'. Toutefois, le haut-voté réponse à une autre question , dit:
Si vous fournissez le deleter comme argument de modèle (comme en
unique_ptr
) il fait partie de la type et que vous n'avez pas besoin de stocker des données supplémentaires dans les objets de ce type. Si deleter est passé en argument du constructeur (comme enshared_ptr
) vous avez besoin de le stocker dans l'objet. Ce est le coût de plus de souplesse, puisque vous pouvez utiliser différents deleters pour les objets de même type.
Les deux cités au paragraphe sont totalement contradictoires, ce qui me rend confus. Qui plus est, beaucoup de gens, dit - unique_ptr
est zéro frais généraux , car il n'a pas besoin de stocker la deleter comme membre. Cependant, comme nous le savons, unique_ptr
a un constructeur de unique_ptr<obj,del> p(new obj,fcn)
, ce qui signifie que nous pouvons passer un deleter, de sorte à l' unique_ptr
semble avoir stocké deleter en tant que membre. Quel gâchis!