70 votes

Pourquoi unique_ptr a-t-il le paramètre deleter comme type, alors que shared_ptr ne l’a pas?

L' std::unique_ptr modèle dispose de deux paramètres: le type de la pointee, et le type de la deleter. Ce second paramètre a une valeur par défaut, il est donc en général il suffit d'écrire quelque chose comme std::unique_ptr<int>.

L' std::shared_ptr modèle possède un seul paramètre: le type de la pointee. Mais vous pouvez utiliser un personnalisé deleter avec celui-ci aussi, même si la deleter type n'est pas dans la classe de modèle. La mise en oeuvre habituelle utilise le type d'effacement des techniques pour ce faire.

Est-il une raison à la même idée n'a pas été utilisé pour l' std::unique_ptr?

43voto

Puppy Points 90818

Partie de la raison en est qu' shared_ptr besoin d'un contrôle explicite bloc de toute façon pour la ref nombre et coller une deleter n'est pas un gros problème sur le dessus. unique_ptr cependant ne nécessite pas de traitement supplémentaire, et en ajoutant qu'il serait impopulaire - c'est censé être un zéro en tête de classe. unique_ptr est censé être statique.

Vous pouvez toujours ajouter votre propre type d'effacement sur le dessus si vous voulez que les comportements - par exemple, vous pouvez avoir unique_ptr<T, std::function<void(T*)>>, quelque chose que j'ai fait dans le passé.

2voto

Damon Points 26437

Une autre raison, en plus de celle signalée par DeadMG, serait qu’il est possible d’écrire

 std::unique_ptr<int[]> a(new int[100]);
 

et ~unique_ptr appellera la version correcte de delete (via default_delete<_Tp[]> ) grâce à la spécialisation à la fois pour T et T[] .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X