C ++ adalah tentang kepemilikan memori - alias semantik kepemilikan .
Ini adalah tanggung jawab pemilik sebagian dari memori yang dialokasikan secara dinamis untuk melepaskan memori itu. Jadi pertanyaannya sebenarnya menjadi siapa yang memiliki ingatan.
Dalam C ++, kepemilikan didokumentasikan oleh jenis pointer mentah yang dibungkus di dalamnya sehingga dalam program C ++ yang baik (IMO) sangat jarang ( jarang , tidak pernah ) untuk melihat pointer mentah diedarkan (karena pointer mentah tidak memiliki kepemilikan yang disimpulkan sehingga kita bisa tidak memberi tahu siapa yang memiliki memori dan dengan demikian tanpa membaca dokumentasi dengan cermat, Anda tidak dapat mengetahui siapa yang bertanggung jawab atas kepemilikan).
Sebaliknya, sangat jarang untuk melihat pointer mentah disimpan di kelas setiap pointer mentah disimpan dalam bungkus smart pointer-nya sendiri. ( NB: Jika Anda tidak memiliki objek, Anda tidak boleh menyimpannya karena Anda tidak dapat mengetahui kapan objek itu akan keluar dari ruang lingkup dan dimusnahkan.)
Jadi pertanyaannya:
- Jenis kepemilikan semantik apa yang sering ditemukan orang?
- Kelas standar apa yang digunakan untuk mengimplementasikan semantik tersebut?
- Dalam situasi apa Anda menganggapnya berguna?
Mari kita pertahankan 1 jenis kepemilikan semantik per jawaban sehingga dapat dipilih naik turun secara individual.
Ringkasan:
Secara konseptual, petunjuk cerdas itu sederhana dan implementasi yang naif itu mudah. Saya telah melihat banyak penerapan percobaan, tetapi selalu gagal dalam beberapa cara yang tidak jelas untuk penggunaan dan contoh biasa. Oleh karena itu, saya sarankan untuk selalu menggunakan petunjuk cerdas yang teruji dengan baik dari perpustakaan daripada menggulirkannya sendiri. std::auto_ptr
atau salah satu petunjuk cerdas Boost sepertinya memenuhi semua kebutuhan saya.
std::auto_ptr<T>
:
Orang lajang memiliki objek tersebut. Transfer kepemilikan diperbolehkan.
Penggunaan: Ini memungkinkan Anda untuk menentukan antarmuka yang menunjukkan transfer kepemilikan secara eksplisit.
boost::scoped_ptr<T>
Orang lajang memiliki objek tersebut. Transfer kepemilikan TIDAK diperbolehkan.
Penggunaan: Digunakan untuk menunjukkan kepemilikan eksplisit. Objek akan dihancurkan oleh destruktor atau saat disetel ulang secara eksplisit.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Kepemilikan ganda. Ini adalah referensi pointer terhitung sederhana. Saat jumlah referensi mencapai nol, objek dimusnahkan.
Kegunaan: Ketika suatu objek dapat memiliki banyak bunga dengan masa pakai yang tidak dapat ditentukan pada waktu kompilasi.
boost::weak_ptr<T>
:
Digunakan dengan shared_ptr<T>
situasi di mana siklus petunjuk mungkin terjadi.
Penggunaan: Digunakan untuk menghentikan siklus dari mempertahankan objek ketika hanya siklus yang mempertahankan refcount bersama.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Bisakah ini diubah? Saya tidak mengerti sama sekali.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. Penunjuk RAW tidak memiliki semantik kepemilikan. Jika Anda tidak mengetahui pemiliknya, Anda tidak tahu siapa yang bertanggung jawab untuk menghapus objek. Ada beberapa kelas standar yang digunakan untuk membungkus pointer (std :: shared_ptr, std :: unique_ptr dll) yang mendefinisikan kepemilikan dan karenanya tentukan siapa yang bertanggung jawab untuk menghapus penunjuk.