Peletakan Baharu dan Padam
Dalam C , lebih muatan pengendali membenarkan penggunaan pengendali baharu dan padam tersuai. Walau bagaimanapun, ini menimbulkan persoalan tentang cara mengagihkan memori yang diperuntukkan dengan pengendali sedemikian dengan betul. Pertimbangkan coretan kod berikut:
<code class="cpp">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf; // OR delete buf;</code>
Mewakilkan tugas pengagihan memori kepada pengendali pemadaman yang terlebih beban (kaedah langsung) nampaknya logik. Walau bagaimanapun, pendekatan ini tidak betul.
Kaedah Betul
Cara yang betul untuk mengagihkan memori dalam kes ini ialah dengan memanggil secara eksplisit pemusnah untuk objek, diikuti oleh operator fungsi padam untuk melepaskan memori yang diperuntukkan:
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
Penjelasan
Apabila menggunakan operator baharu penempatan, yang mengambil alamat memori yang telah diperuntukkan sebelumnya, pembina lalai ialah tidak dipanggil secara automatik. Oleh itu, adalah penting untuk memanggil pemusnah secara manual. Sebagai alternatif, memanggil delete buf secara terus juga tidak betul kerana ia hanya memanggil operator global padam, yang tidak mengetahui tentang peruntukan baharu peletakan.
Bila Menggunakan Buf->~Buffer()
Panggilan pemusnah (buf->~Buffer()) diperlukan apabila operator baharu peletakan digunakan, walaupun apabila fungsi pemadaman ::operator dipanggil kemudiannya.
Amalan Terbaik
Untuk mengelakkan kekeliruan, sentiasa gunakan pasangan operator yang sepadan, seperti:
Atas ialah kandungan terperinci Apabila Menggunakan Peletakan Baharu, Adakah `padam` Sebenarnya Nyah Peruntukan Dengan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!