unique_ptr
tidak dapat disalin, hanya dapat dipindahkan.
Ini secara langsung akan memengaruhi Test, yang, pada contoh kedua Anda, juga hanya dapat dipindahkan dan tidak dapat disalin.
Faktanya, ada baiknya Anda menggunakan unique_ptr
yang melindungi Anda dari kesalahan besar.
Misalnya, masalah utama dengan kode pertama Anda adalah bahwa penunjuk tidak pernah dihapus yang benar-benar buruk. Katakan, Anda akan memperbaikinya dengan:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Ini juga buruk. Apa yang terjadi, jika Anda menyalin Test
? Akan ada dua kelas yang memiliki penunjuk yang menunjuk ke alamat yang sama.
Ketika salah satu Test
dihancurkan, itu juga akan menghancurkan penunjuk. Saat detik Anda Test
hancur, ia juga akan mencoba menghapus memori di belakang penunjuk. Tetapi itu telah dihapus dan kami akan mendapatkan beberapa kesalahan runtime akses memori yang buruk (atau perilaku tidak ditentukan jika kami tidak beruntung).
Jadi, cara yang benar adalah dengan mengimplementasikan copy constructor dan copy assignment operator, sehingga perilakunya jelas dan kita bisa membuat salinannya.
unique_ptr
jauh di depan kita di sini. Ini memiliki arti semantik: " Saya unique
, jadi Anda tidak bisa begitu saja menyalin saya. " Jadi, ini mencegah kita dari kesalahan sekarang menerapkan operator yang ada.
Anda dapat menentukan copy constructor dan menyalin operator penugasan untuk perilaku khusus dan kode Anda akan berfungsi. Tapi Anda, memang (!), Dipaksa untuk melakukan itu.
Moral cerita: selalu gunakan unique_ptr
dalam situasi seperti ini.