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_ptryang 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 Testdihancurkan, itu juga akan menghancurkan penunjuk. Saat detik Anda Testhancur, 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_ptrjauh 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_ptrdalam situasi seperti ini.