Rumah >pembangunan bahagian belakang >C++ >Bolehkah shared_ptr Berfungsi Tanpa Pemusnah Maya Kelas Polimorfik?

Bolehkah shared_ptr Berfungsi Tanpa Pemusnah Maya Kelas Polimorfik?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-16 11:45:11135semak imbas

Can shared_ptr Work Without Polymorphic Class Virtual Destructors?

Pelaksanaan Shared_Ptr Tanpa Pemusnah Maya Kelas Polimorfik

Dalam perdebatan antara Armen Tsirunyan dan Daniel Lidström tentang keperluan pemusnah maya untuk pelaksanaan shared_ptr, ia sememangnya mungkin untuk mereka bentuk shared_ptr yang tidak memerlukan sedemikian pemusnah.

Pelaksanaan Teknikal

Kunci kepada pelaksanaan ini terletak pada jenis pemadaman. Shared_ptr menguruskan bukan sahaja kaunter rujukan tetapi juga objek pemadam yang disimpan dalam blok memori yang sama. Jenis pemadam ini berbeza daripada shared_ptr, membenarkan fleksibiliti dalam mengurus objek dengan jenis dinamik yang berbeza.

Pembina templat diperkenalkan:

template<class T>
class shared_ptr
{
public:
   ...
   template<class Y>
   explicit shared_ptr(Y* p);
   ...
};

Apabila membina shared_ptr dengan penunjuk kelas terbitan (cth., shared_ptr sp (baharu Derived)), pembina templat dengan Y=Derived digunakan. Pembina ini mencipta objek pemadam dengan pengetahuan khusus tentang kelas Terbitan. Apabila mencapai kiraan rujukan sifar, pemadam ini digunakan untuk melupuskan tika Terbitan dengan selamat, walaupun tanpa pemusnah maya dalam kelas Asas.

C 11 Keperluan Standard

Piawaian C 11 secara jelas mentakrifkan keperluan untuk ini pembina:

  • Penunjuk p mesti boleh ditukar kepada T* dan Y mestilah jenis yang lengkap.
  • Ungkapan "padam p" mesti dibentuk dengan baik, mempunyai definisi yang baik tingkah laku, dan tidak membuang pengecualian.

Untuk pemusnah:

  • Jika shared_ptr kosong atau berkongsi pemilikan, tiada kesan sampingan.
  • Jika shared_ptr memiliki objek dengan pemadam d, d(p) dipanggil.
  • Jika tidak, jika shared_ptr memiliki penunjuk p , "padam p" digunakan.

Oleh itu, pelaksanaan shared_ptr menggunakan memadam taip dan mengurus pemadam dengan teliti untuk melupuskan objek dengan jenis dinamik yang berbeza dengan berkesan, walaupun tanpa memerlukan pemusnah maya dalam kelas polimorfik.

Atas ialah kandungan terperinci Bolehkah shared_ptr Berfungsi Tanpa Pemusnah Maya Kelas Polimorfik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn