Puede haber muchas razones. Para enumerar algunos de ellos:
- Los punteros inteligentes se convirtieron en parte del estándar recientemente. Hasta entonces eran parte de otras bibliotecas.
- Su uso principal es evitar pérdidas de memoria; muchas bibliotecas no tienen su propia administración de memoria; Generalmente proporcionan utilidades y API
- Se implementan como contenedor, ya que en realidad son objetos y no punteros. Que tiene un costo adicional de tiempo / espacio, en comparación con los punteros sin procesar; Los usuarios de las bibliotecas pueden no querer tener tales gastos generales
Editar : El uso de punteros inteligentes es una elección completamente del desarrollador. Depende de varios factores.
En los sistemas críticos de rendimiento, es posible que no desee utilizar punteros inteligentes que generan gastos generales
El proyecto que necesita la compatibilidad con versiones anteriores, es posible que no desee utilizar los punteros inteligentes que tienen características específicas de C ++ 11
Edit2 Hay una cadena de varios votos negativos en el lapso de 24 horas debido al pasaje a continuación. No entiendo por qué se rechaza la respuesta, aunque a continuación se muestra solo una sugerencia adicional y no una respuesta.
Sin embargo, C ++ siempre te facilita tener las opciones abiertas. :) p.ej
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
Y en tu código úsalo como:
Pointer<int>::type p;
Para aquellos que dicen que un puntero inteligente y un puntero sin formato son diferentes, estoy de acuerdo con eso. El código anterior era solo una idea en la que uno puede escribir un código que sea intercambiable solo con un #define
, esto no es una obligación ;
Por ejemplo, T*
tiene que eliminarse explícitamente, pero un puntero inteligente no. Podemos tener una plantilla Destroy()
para manejar eso.
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
y úsalo como:
Destroy(p);
Del mismo modo, para un puntero sin formato podemos copiarlo directamente y para un puntero inteligente podemos usar una operación especial.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Donde Assign()
es como:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}