Dunia tempat Bjarne tinggal sangat ... akademis, karena menginginkan masa jabatan yang lebih baik. Jika kode Anda dapat dirancang dan disusun sedemikian rupa sehingga objek memiliki hierarki relasional yang disengaja, sehingga hubungan kepemilikan menjadi kaku dan pantang menyerah, kode mengalir dalam satu arah (dari level tinggi ke level rendah), dan objek hanya berbicara dengan yang lebih rendah di hierarki, maka Anda tidak akan menemukan banyak kebutuhan shared_ptr
. Ini adalah sesuatu yang Anda gunakan pada kesempatan langka di mana seseorang harus melanggar aturan. Tetapi jika tidak, Anda bisa memasukkan semuanya ke dalam vector
atau struktur data lain yang menggunakan semantik nilai, dan unique_ptr
untuk hal-hal yang harus Anda alokasikan sendiri.
Meskipun itu adalah dunia yang hebat untuk ditinggali, itu bukan apa yang bisa Anda lakukan sepanjang waktu. Jika Anda tidak dapat mengatur kode Anda dengan cara itu, karena desain sistem yang Anda coba buat berarti tidak mungkin (atau hanya sangat tidak menyenangkan), maka Anda akan menemukan diri Anda membutuhkan kepemilikan bersama atas benda-benda yang semakin banyak. .
Dalam sistem seperti itu, memegang pointer telanjang adalah ... tidak persis berbahaya, tetapi itu menimbulkan pertanyaan. Hal yang hebat tentang itu shared_ptr
adalah memberikan jaminan sintaksis yang wajar tentang masa hidup objek. Bisakah itu rusak? Tentu saja. Tetapi orang juga dapat melakukan banyak const_cast
hal; perawatan dasar dan pemberian makan shared_ptr
harus memberikan kualitas hidup yang wajar untuk objek yang dialokasikan yang kepemilikannya harus dibagi.
Lalu, ada weak_ptr
s, yang tidak dapat digunakan tanpa adanya a shared_ptr
. Jika sistem Anda terstruktur dengan kaku, maka Anda dapat menyimpan pointer telanjang ke beberapa objek, aman karena mengetahui bahwa struktur aplikasi memastikan bahwa objek yang ditunjuk akan hidup lebih lama dari Anda. Anda dapat memanggil fungsi yang mengembalikan pointer ke beberapa nilai internal atau eksternal (misalnya, cari objek bernama X). Dalam kode yang terstruktur dengan baik, fungsi itu hanya akan tersedia untuk Anda jika umur objek dijamin melebihi milik Anda; dengan demikian, menyimpan pointer telanjang di objek Anda baik-baik saja.
Karena kekakuan itu tidak selalu mungkin dicapai dalam sistem nyata, Anda perlu beberapa cara untuk memastikan masa pakai yang wajar . Terkadang, Anda tidak perlu kepemilikan penuh; Terkadang, Anda hanya perlu tahu kapan pointer buruk atau bagus. Di situlah weak_ptr
masuk. Ada kasus di mana saya bisa menggunakan unique_ptr
atau boost::scoped_ptr
, tapi saya harus menggunakan shared_ptr
karena saya secara khusus perlu memberi seseorang pointer "volatile". Pointer yang seumur hidupnya tidak pasti, dan mereka dapat menanyakan kapan pointer itu dihancurkan.
Cara aman untuk bertahan hidup ketika keadaan dunia tak tentu.
Mungkinkah itu dilakukan oleh beberapa pemanggilan fungsi untuk mendapatkan pointer, alih-alih via weak_ptr
? Ya, tapi itu bisa lebih mudah dipatahkan. Fungsi yang mengembalikan pointer telanjang tidak memiliki cara yang menunjukkan secara sintaksis bahwa pengguna tidak melakukan sesuatu seperti menyimpan pointer itu dalam jangka panjang. Mengembalikan shared_ptr
juga membuatnya menjadi sangat mudah bagi seseorang untuk menyimpannya dan berpotensi memperpanjang masa hidup suatu objek. Mengembalikan yang weak_ptr
sangat menyarankan bahwa menyimpan shared_ptr
Anda dapatkan dari lock
adalah ... ide yang meragukan. Ini tidak akan menghentikan Anda untuk melakukannya, tetapi tidak ada dalam C ++ yang menghentikan Anda dari memecahkan kode. weak_ptr
memberikan sedikit perlawanan dari melakukan hal yang alami.
Sekarang, itu bukan untuk mengatakan bahwa shared_ptr
tidak bisa digunakan secara berlebihan ; itu pasti bisa. Terutama pra unique_ptr
, ada banyak kasus di mana saya hanya menggunakan boost::shared_ptr
karena saya perlu melewati pointer RAII atau memasukkannya ke dalam daftar. Tanpa memindahkan semantik dan unique_ptr
, boost::shared_ptr
adalah satu-satunya solusi nyata.
Dan Anda dapat menggunakannya di tempat-tempat yang sebenarnya tidak perlu. Seperti yang dinyatakan di atas, struktur kode yang tepat dapat menghilangkan kebutuhan untuk beberapa penggunaan shared_ptr
. Tetapi jika sistem Anda tidak dapat terstruktur seperti itu dan masih melakukan apa yang perlu dilakukan, shared_ptr
akan sangat bermanfaat.