81 votes

Pourquoi unique_ptr utilise-t-il deux paramètres de modèle alors que shared_ptr n'en prend qu'un?

À la fois unique et shared_ptr accepter une coutume destructeur d'appel sur l'objet qu'ils possèdent. Mais dans le cas d' unique_ptr, le destructeur est passé comme un paramètre du modèle de la classe, wherease le type d' shared_ptr's personnalisé destructeur doit être spécifié comme un paramètre du modèle du constructeur.

template <class T, class D = default_delete<T>> 
class unique_ptr
{
    unique_ptr(T*, D&); //simplified
    ...
};

et

template<class T>
class shared_ptr
{
    template<typename D>
    shared_ptr(T*, D); //simplified
    ...
};

Je ne vois pas pourquoi une telle différence. Ce qui implique que?

67voto

Wojtek Surowka Points 10511

Si vous fournissez le deleter comme argument de modèle (comme dans 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 dans shared_ptr), vous devez 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.

Je suppose que c'est la raison pour laquelle: unique_ptr est censé être très léger objet avec zéro frais généraux. Le stockage deleters avec chaque unique_ptr serait d'amener les gens à l'aide de ce bon vieux raw pointeurs au lieu de cela, ce qui serait faux. D'autre part, shared_ptr n'est pas léger, car il a besoin de stocker nombre de références, donc de stocker une coutume deleter trop ressemble à un bon compromis.

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