Bagaimana untuk Membahagikan Memori yang Diperuntukkan dengan Peletakan Baharu dalam C ?

Mary-Kate Olsen
Lepaskan: 2024-10-30 18:24:03
asal
680 orang telah melayarinya

How to Properly Deallocate Memory Allocated with Placement New in C  ?

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

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

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!