Rumah >pembangunan bahagian belakang >C++ >Bolehkah `shared_ptr` Menguruskan Objek `Derived` Tanpa Pemusnah Maya dalam `Base`?

Bolehkah `shared_ptr` Menguruskan Objek `Derived` Tanpa Pemusnah Maya dalam `Base`?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-09 20:53:10458semak imbas

Can `shared_ptr` Manage `Derived` Objects Without a Virtual Destructor in `Base`?

Shared_Ptr dan Polimorfisme Tanpa Pemusnah Maya

Dalam perbahasan baru-baru ini, Daniel Lidström menegaskan bahawa shared_ptr dibina dengan Derived baharu tidak mewajibkan pemusnah maya dalam Base. Artikel ini menyiasat kemungkinan pelaksanaan sedemikian.

Melaksanakan Shared_Ptr Tanpa Pemusnah Maya

Kunci kepada pelaksanaan ini terletak pada pemadaman jenis. Shared_ptr menyimpan lebih daripada sekadar kaunter rujukan; ia termasuk pemadam (disimpan sebagai sebahagian daripada struktur data) yang mengendalikan pemusnahan objek. Pemadam ini boleh terdiri daripada sebarang jenis, membenarkan penyesuaian di luar skop T (jenis templat shared_ptr).

Penyesuaian untuk Kelas Terbitan

Apabila membuat shared_ptr< ;Asas> daripada objek Terbitan, pembina templat digunakan, membenarkan spesifikasi jenis Terbitan konkrit. Pembina mencipta pemadam yang diperlukan dengan pengetahuan tentang jenis dinamik, memastikan pemusnahan objek yang betul walaupun tanpa pemusnah maya dalam Pangkalan.

Contoh Pelaksanaan

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

Perkara di atas pembina membenarkan penciptaan shared_ptr daripada objek Terbitan.

C 11 Keperluan Standard

Standard C 11 secara eksplisit memerlukan tingkah laku ini:

  • Pembina templat mesti memastikan bahawa ungkapan delete p mempunyai tingkah laku yang jelas, walaupun tanpa pemusnah maya dalam T.
  • Jika shared_ptr memiliki objek tanpa pemadam, ia harus memanggil padam p.

Atas ialah kandungan terperinci Bolehkah `shared_ptr` Menguruskan Objek `Derived` Tanpa Pemusnah Maya dalam `Base`?. 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