Bolehkah Panggilan Pemusnah Manual Menunjukkan Reka Bentuk Buruk?
Adalah dipercayai secara meluas bahawa penggunaan pemusnah secara manual menunjukkan reka bentuk yang buruk. Walau bagaimanapun, terdapat pengecualian kepada peraturan ini.
Satu senario di mana panggilan pemusnah manual menjadi perlu ialah apabila hanya objek perlu dimusnahkan tanpa melepaskan memori yang diperuntukkan. Ini biasanya berlaku dalam senario di mana peruntukan memori dan deallocation dikendalikan secara berasingan daripada pembinaan dan pemusnahan objek. Dalam kes sedemikian, objek dibina menggunakan peletakan baharu pada blok memori sedia ada dan pemusnah dipanggil secara manual untuk melenyapkannya.
Pertimbangkan contoh berikut:
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); } { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
Satu lagi contoh ketara di mana manual panggilan pemusnah timbul ialah std:: allocator lalai yang digunakan oleh std::vector. Elemen dibina dalam vektor semasa push_back, tetapi memori diperuntukkan dalam ketulan terlebih dahulu. Akibatnya, vector::erase boleh memusnahkan elemen tanpa semestinya membebaskan memori asas, terutamanya jika operasi push_back dijangka tidak lama lagi.
Walaupun panggilan pemusnah manual menyimpang daripada prinsip OOP yang ketat, ia mungkin sesuai dalam situasi di mana pengurusan memori adalah bebas daripada kitaran hayat objek. Selain itu, melaksanakan pendekatan ini secara tempatan dalam kelas yang direka untuk tujuan sedemikian boleh melayakkan diri sebagai reka bentuk yang baik.
Atas ialah kandungan terperinci Bilakah Memanggil Pemusnah Secara Manual Pilihan Reka Bentuk Yang Baik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!