Bunun birçok nedeni olabilir. Bunlardan birkaçını listelemek için:
- Akıllı işaretçiler son zamanlarda standardın bir parçası haline geldi. O zamana kadar diğer kütüphanelerin bir parçasıydılar
- Birincil kullanımları bellek sızıntılarından kaçınmaktır; birçok kütüphanenin kendi bellek yönetimi yoktur; Genellikle yardımcı programlar ve API'lar sağlarlar
- Bunlar aslında işaretçiler değil, nesneler oldukları için sarıcı olarak uygulanırlar. Ham işaretçilerle karşılaştırıldığında ek zaman / alan maliyeti olan; Kütüphanelerin kullanıcıları böyle bir ek yüke sahip olmak istemeyebilirler
Düzenleme : Akıllı işaretçiler kullanmak tamamen geliştiricinin seçimidir. Çeşitli faktörlere bağlıdır.
Performans açısından kritik öneme sahip sistemlerde, ek yük oluşturan akıllı işaretçiler kullanmak istemeyebilirsiniz
Geriye dönük uyumluluğa ihtiyaç duyan proje, C ++ 11'e özgü özelliklere sahip akıllı işaretçileri kullanmak istemeyebilirsiniz
Edit2 Aşağıdaki pasaj nedeniyle 24 saat içinde birkaç downvotes dizisi var. Aşağıda bir yanıt değil, yalnızca bir eklenti önerisi olmasına rağmen cevabın neden reddedildiğini anlayamıyorum.
Ancak, C ++ her zaman seçeneklerin açık olmasını sağlar. :) Örneğin
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
Ve kodunuzda şu şekilde kullanın:
Pointer<int>::type p;
Akıllı bir işaretçinin ve ham bir işaretçinin farklı olduğunu söyleyenler için buna katılıyorum. Yukarıdaki kod, sadece a ile değiştirilebilir bir kod yazabileceği bir fikirdi#define
, bu bir zorlama değil ;
Örneğin, T*
açıkça silinmesi gerekir , ancak akıllı bir işaretçi silinmez. Bununla Destroy()
başa çıkmak için bir şablon olabilir .
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
ve şu şekilde kullanın:
Destroy(p);
Aynı şekilde, ham bir işaretçi için doğrudan kopyalayabiliriz ve akıllı işaretçi için özel bir işlem kullanabiliriz.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Nerede Assign()
:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}