Mungkin ada banyak alasan. Untuk membuat daftar beberapa di antaranya:
- Pointer pintar menjadi bagian dari standar baru-baru ini. Sampai saat itu mereka adalah bagian dari perpustakaan lain
- Penggunaan utama mereka adalah untuk menghindari kebocoran memori; banyak perpustakaan tidak memiliki manajemen memori sendiri; Umumnya mereka menyediakan utilitas dan API
- Mereka diimplementasikan sebagai pembungkus, karena mereka sebenarnya objek dan bukan pointer. Yang memiliki biaya waktu / ruang tambahan, dibandingkan dengan pointer mentah; Para pengguna perpustakaan mungkin tidak ingin memiliki overhead seperti itu
Sunting : Menggunakan smart pointer adalah pilihan sepenuhnya pengembang. Itu tergantung pada berbagai faktor.
Dalam sistem kritis kinerja, Anda mungkin tidak ingin menggunakan smart pointer yang menghasilkan overhead
Proyek yang membutuhkan kompatibilitas ke belakang, Anda mungkin tidak ingin menggunakan smart pointer yang memiliki fitur khusus C ++ 11
Sunting2 Ada serangkaian beberapa downvotes dalam rentang 24 jam karena bagian di bawah ini. Saya gagal memahami mengapa jawabannya diturunkan meskipun di bawah ini hanya saran tambahan dan bukan jawaban.
Namun, C ++ selalu memfasilitasi Anda untuk membuka opsi. :) mis
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
Dan dalam kode Anda menggunakannya sebagai:
Pointer<int>::type p;
Bagi mereka yang mengatakan bahwa smart pointer dan raw pointer berbeda, saya setuju dengan itu. Kode di atas hanyalah sebuah ide di mana seseorang dapat menulis kode yang dapat dipertukarkan hanya dengan a #define
, ini bukan paksaan ;
Sebagai contoh, T*
harus dihapus secara eksplisit tetapi pointer pintar tidak. Kita dapat memiliki templated Destroy()
untuk mengatasinya.
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
// do nothing
}
dan gunakan sebagai:
Destroy(p);
Dengan cara yang sama, untuk pointer mentah kita dapat menyalinnya secara langsung dan untuk smart pointer kita dapat menggunakan operasi khusus.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
Di mana Assign()
adalah sebagai:
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
// use move sematics or whateve appropriate
}