shared_ptr pointer make_unique example create c++ smart-pointers type-erasure

c++ - pointer - shared_ptr reference



¿Por qué unique_ptr tiene el eliminador como un parámetro de tipo, mientras que shared_ptr no? (2)

La plantilla std::unique_ptr tiene dos parámetros: el tipo de punta y el tipo de eliminador. Este segundo parámetro tiene un valor predeterminado, por lo que generalmente solo escribe algo como std::unique_ptr<int> .

Sin std::shared_ptr plantilla std::shared_ptr tiene solo un parámetro: el tipo de punta. Pero también puedes usar un eliminador personalizado con este, aunque el tipo de eliminador no esté en la plantilla de la clase. La implementación habitual usa técnicas de borrado de tipo para hacer esto.

¿Hay alguna razón por la cual no se usó la misma idea para std::unique_ptr ?


Otra razón, además de la señalada por DeadMG, sería que es posible escribir

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

y ~unique_ptr llamará a la versión correcta de delete (a través de default_delete<_Tp[]> ) gracias a la especialización para T y T[] .


Parte de la razón es que shared_ptr necesita un bloque de control explícito de todos modos para el recuento de ref y pegar un delegado no es un gran problema en la parte superior. unique_ptr sin embargo, no requiere ninguna sobrecarga adicional, y agregarlo sería impopular, se supone que es una clase de gastos generales cero. unique_ptr se supone que es estático.

Siempre puede agregar su propio borrado de tipo si desea ese comportamiento, por ejemplo, puede tener unique_ptr<T, std::function<void(T*)>> , algo que he hecho en el pasado.