Pode haver muitas razões. Para listar alguns deles:
- Ponteiros inteligentes passaram a fazer parte do padrão recentemente. Até então eles faziam parte de outras bibliotecas
- Seu uso principal é evitar vazamentos de memória; muitas bibliotecas não têm seu próprio gerenciamento de memória; Geralmente eles fornecem utilitários e APIs
- Eles são implementados como wrapper, pois na verdade são objetos e não ponteiros. Que possui custo adicional de tempo / espaço, comparado aos indicadores brutos; Os usuários das bibliotecas podem não querer ter essas despesas gerais
Editar : O uso de ponteiros inteligentes é uma escolha totalmente do desenvolvedor. Depende de vários fatores.
Em sistemas críticos de desempenho, talvez você não queira usar ponteiros inteligentes que geram sobrecarga
O projeto que precisa de compatibilidade com versões anteriores, talvez você não queira usar os ponteiros inteligentes que possuem recursos específicos do C ++ 11
Edit2 Há uma série de várias votações negativas no período de 24 horas por causa da passagem abaixo. Não consigo entender por que a resposta foi reduzida, mesmo que abaixo seja apenas uma sugestão de complemento e não uma resposta.
No entanto, o C ++ sempre facilita a abertura das opções. :) por exemplo
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
E no seu código, use-o como:
Pointer<int>::type p;
Para aqueles que dizem que um ponteiro inteligente e um ponteiro bruto são diferentes, eu concordo com isso. O código acima era apenas uma idéia em que se pode escrever um código que é intercambiável apenas com a #define
, isso não é compulsão ;
Por exemplo, T*
deve ser excluído explicitamente, mas um ponteiro inteligente não. Podemos ter um modelo Destroy()
para lidar com isso.
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
e use-o como:
Destroy(p);
Da mesma forma, para um ponteiro bruto, podemos copiá-lo diretamente e para ponteiro inteligente, podemos usar uma operação especial.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Onde Assign()
está como:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}