Dalam perbahasan kami, kami mempersoalkan keperluan menghendaki kelas polimorfik mempunyai pemusnah maya untuk pelaksanaan shared_ptr. Hujah yang dikemukakan mendakwa shared_ptr boleh berfungsi dengan betul tanpa keperluan ini.
Mari kita mendalami pelaksanaan shared_ptr untuk menentukan kesahihan tuntutan ini.
Taip Pemadaman dan Pembina Templat
shared_ptr menggunakan pemadam jenis untuk menyimpan pemadam dalam blok memori yang sama dengan kaunter rujukannya. Jenis pemadam ini bukan sebahagian daripada jenis shared_ptr. Dengan menggunakan pembina templat, shared_ptr boleh menampung pelbagai jenis pemadam berdasarkan kelas tertentu yang diuruskan.
Pembina berikut boleh ditakrifkan untuk mengendalikan ini:
template<class T> class shared_ptr { public: ... template<class Y> explicit shared_ptr(Y* p); ... };
Apabila menggunakan pembina ini dengan kelas Base dan Derived, pemadam yang sesuai boleh dibuat dan disimpan. Pemadam ini akan digunakan apabila kaunter rujukan menurun kepada sifar, memastikan pelupusan objek yang betul.
Keperluan Standard C 11
Piawaian C 11 secara eksplisit memerlukan tingkah laku ini untuk pembina templat:
"Kesan: Membina objek shared_ptr yang memiliki penunjuk p."
Ini mengesahkan bahawa shared_ptr mengambil alih pemilikan penunjuk yang diluluskan dan bertanggungjawab ke atas pemusnahannya.
Fungsi Pemusnah
Tingkah laku pemusnah ditakrifkan seperti berikut:
"Kesan: Jika ini memiliki objek p dan pemadam d, d(p) dipanggil, jika ini memiliki penunjuk p, dan padam p dipanggil."
Ini menunjukkan bahawa jika shared_ptr. secara langsung menguruskan penunjuk (iaitu, tanpa pemadam eksplisit), pemadaman pemusnah lalai digunakan untuk melupuskan objek.
Kesimpulan
Berdasarkan garis panduan ini, adalah jelas bahawa shared_ptr boleh dilaksanakan tanpa memerlukan kelas polimorfik mempunyai pemusnah maya. Teknik yang dinyatakan di atas, seperti pemadaman jenis dan pembina templat, membolehkan shared_ptr mengurus objek dari sebarang jenis dengan berkesan, termasuk objek yang tidak menyokong polimorfisme.
Atas ialah kandungan terperinci Bolehkah `shared_ptr` Berfungsi dengan Betul Tanpa Pemusnah Maya dalam Kelas Polimorfik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!