Potensi Perangkap dalam Mendapatkan daripada Kontena C STL
Dalam bidang pengaturcaraan C, sering timbul perdebatan mengenai merit terbitan daripada bekas perpustakaan standard (bekas yang disertakan dengan perpustakaan standard C, seperti vektor, senarai, dll.) atau hanya menggunakan typedefs untuk mewakili mereka (mencipta nama baharu untuk jenis sedia ada tanpa menentukan jenis baharu). Walaupun kedua-dua pendekatan menawarkan kelebihan mereka, adalah penting untuk mengetahui potensi risiko yang berkaitan dengan terbitan daripada bekas STL.
Apabila menggunakan terbitan, adalah penting untuk diingat bahawa bekas standard, seperti vektor, tidak mengisytiharkan pemusnah mereka sebagai maya. Ini bermakna jika anda memperoleh daripada salah satu bekas ini dan mentakrifkan pemusnah bukan maya dalam kelas terbitan anda, anda akan menghadapi masalah apabila cuba memusnahkan objek kelas terbitan itu menggunakan penuding ke kelas asas.
Untuk menggambarkan isu ini, pertimbangkan contoh berikut:
class Rates : public std::vector<double> { /* ... */ }; int main() { std::vector<double>* p = new Rates; delete p; // This will invoke the non-virtual ~std::vector<double>(), potentially leading to problems }
Dalam kes ini, apabila pengendali padam dipanggil pada penunjuk p, ia akan memanggil pemusnah kelas asas, std::vector
Oleh itu, sementara terbitan daripada bekas STL menawarkan kelebihan tertentu, seperti mendayakan lebihan fungsi dan pengkhususan templat, ia adalah penting. untuk berhati-hati dan pastikan anda tidak mengatasi pemusnah kelas asas dengan bukan maya. Jika anda memerlukan gelagat polimorfik, pertimbangkan untuk menggunakan gubahan dan bukannya warisan.
Atas ialah kandungan terperinci Patutkah Anda Dapatkan daripada Bekas C STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!