Konstruktor unique_ptr<T>
menerima penunjuk mentah ke objek bertipe T
(jadi, ia menerima a T*
).
Pada contoh pertama:
unique_ptr<int> uptr (new int(3));
Pointer adalah hasil new
ekspresi, sedangkan pada contoh kedua:
unique_ptr<double> uptr2 (pd);
Penunjuk disimpan dalam pd
variabel.
Secara konseptual, tidak ada yang berubah (Anda membuat a unique_ptr
dari pointer mentah), tetapi pendekatan kedua berpotensi lebih berbahaya, karena akan memungkinkan Anda, misalnya, untuk melakukan:
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
Dengan demikian memiliki dua penunjuk unik yang secara efektif merangkum objek yang sama (sehingga melanggar semantik penunjuk unik ).
Inilah mengapa formulir pertama untuk membuat penunjuk unik lebih baik, jika memungkinkan. Perhatikan, bahwa dalam C ++ 14 kita dapat melakukan:
unique_ptr<int> p = make_unique<int>(42);
Yang mana lebih jelas dan lebih aman. Sekarang tentang keraguan Anda ini:
Yang juga tidak jelas bagi saya, adalah bagaimana pointer yang dinyatakan dengan cara ini akan berbeda dari pointer yang dinyatakan dengan cara yang "normal".
Pointer cerdas seharusnya memodelkan kepemilikan objek, dan secara otomatis menangani pemusnahan objek yang diarahkan saat pointer terakhir (cerdas, memiliki) ke objek tersebut berada di luar cakupan.
Dengan cara ini Anda tidak perlu mengingat melakukannya delete
pada objek yang dialokasikan secara dinamis - destruktor dari smart pointer akan melakukannya untuk Anda - atau khawatir tentang apakah Anda tidak akan membatalkan pointer (menggantung) ke objek yang sudah dihancurkan:
{
unique_ptr<int> p = make_unique<int>(42);
}
Sekarang unique_ptr
adalah penunjuk cerdas yang memodelkan kepemilikan unik, yang berarti bahwa setiap saat dalam program Anda hanya akan ada satu penunjuk (yang memiliki) ke objek yang diarahkan - itulah mengapa unique_ptr
tidak dapat disalin.
Selama Anda menggunakan petunjuk cerdas dengan cara yang tidak melanggar kontrak implisit yang harus Anda patuhi, Anda akan mendapat jaminan bahwa tidak ada memori yang bocor, dan kebijakan kepemilikan yang tepat untuk objek Anda akan diberlakukan. Petunjuk mentah tidak memberi Anda jaminan ini.
new int(3)
mengembalikan sebuah penunjuk ke yang baruint
, sepertipd
penunjuk ke yang barudouble
.