Rumah > pembangunan bahagian belakang > C++ > Apabila Menggunakan Peletakan Baharu, Adakah `padam` Sebenarnya Nyah Peruntukan Dengan Betul?

Apabila Menggunakan Peletakan Baharu, Adakah `padam` Sebenarnya Nyah Peruntukan Dengan Betul?

Barbara Streisand
Lepaskan: 2024-10-28 12:50:02
asal
853 orang telah melayarinya

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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:

  • ::operator baharu dan ::operator delete
  • new() dan delete() (peletakan baru/delete)

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan