peletakan baharu dan padam Teka-teki
Dalam C , apabila memperuntukkan memori dengan pengendali baharu peletakan, dilema timbul mengenai kaedah yang sesuai untuk deallokasi ingatan itu. Mari kita terokai dua penyelesaian yang berpotensi:
Penyelesaian 1:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf;</code>
Penyelesaian ini cuba memadamkan memori yang diperuntukkan sebagai penunjuk aksara. Walau bagaimanapun, pendekatan ini tidak betul kerana ia tidak mengendalikan pemusnah objek dengan betul atau mengalokasikan memori mentah.
Penyelesaian 2:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete buf;</code>
Penyelesaian ini juga cuba untuk padamkan memori yang diperuntukkan, tetapi terus memanggil operator padam pada penuding Penampan*. Ini akan berfungsi jika memori diperuntukkan menggunakan operator baharu biasa. Walau bagaimanapun, memandangkan peletakan baharu telah digunakan, pendekatan ini juga tidak betul.
Penyelesaian Betul:
Kaedah yang betul untuk membebaskan memori yang diperuntukkan ialah:
<code class="c++">buf->~Buffer(); ::operator delete(mem);</code>
Penyelesaian ini secara eksplisit memanggil pemusnah untuk objek Penampan (buf->~Buffer()) dan kemudian mendelokasikan memori mentah menggunakan fungsi padam operator (::operator delete(mem)).
Perbezaan kritikal di sini ialah apabila menggunakan peletakan baharu, fungsi pemadaman pengendali mesti dipanggil terus untuk membebaskan memori mentah. Percubaan untuk memadamkan penuding yang diperoleh daripada operator baharu peletakan tidak akan memanggil pemusnah atau mendelokasikan memori sepenuhnya dengan betul.
Atas ialah kandungan terperinci Bagaimana untuk Membahagikan Memori yang Diperuntukkan dengan Peletakan Baharu dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!