Rumah >pembangunan bahagian belakang >C++ >Patutkah Pemusnah Maya Tulen dalam C Dilaksanakan?

Patutkah Pemusnah Maya Tulen dalam C Dilaksanakan?

Susan Sarandon
Susan Sarandonasal
2024-12-23 15:56:11333semak imbas

Should a Pure Virtual Destructor in C   Be Implemented?

Pemusnah Maya Tulen dalam C : Kisah Peringatan

Apabila mentakrifkan kelas asas abstrak dalam C , mungkin tergoda untuk mengisytiharkan pemusnah maya sebagai maya semata-mata, sebagai ditunjukkan dalam coretan kod di bawah:

class A {
public:
    virtual ~A() = 0;
};

Sementara sintaks ini sah dalam penyusun tertentu, seperti MSVC, ia menimbulkan bahaya mengintai yang boleh membawa kepada ranap masa jalan.

Masalah: Perlaksanaan Pemusnah Hilang

Isu dengan kod di atas ialah pemusnah maya diisytiharkan menjadi murni tanpa menyediakan pelaksanaan. Ini bermakna bahawa tingkah laku pemusnah diwakilkan kepada kelas terbitan konkrit. Walau bagaimanapun, jika objek jenis A itu sendiri pernah dimusnahkan, pemusnahnya akan dipanggil, dan kekurangan pelaksanaannya akan mengakibatkan tingkah laku yang tidak ditentukan.

Potensi Akibat

Dalam senario biasa, memperoleh daripada kelas asas abstrak A dan cuba memusnahkan objek kelas terbitan akhirnya akan menggunakan pemusnah A. Tanpa pelaksanaan, ini boleh mencetuskan gelagat yang tidak ditentukan pada platform tertentu, seperti menggunakan pengendali panggilan tulen dan ranap program.

Penyelesaian: Melaksanakan Pemusnah

Untuk menyelesaikan isu ini, asas abstrak pemusnah kelas harus dilaksanakan secara eksplisit, walaupun badannya kosong. Coretan kod yang diperbetulkan di bawah menunjukkan perkara ini:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

Dengan menyediakan pelaksanaan kosong untuk pemusnah A, anda memastikan kelakuannya ditakrifkan apabila dipanggil secara terus atau melalui kelas terbitan.

Atas ialah kandungan terperinci Patutkah Pemusnah Maya Tulen dalam C Dilaksanakan?. 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