Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Peletakan Baharu: Mengapa Kami Tidak Boleh Menggunakan `padam` untuk Mengagihkan Memori?

Peletakan Baharu: Mengapa Kami Tidak Boleh Menggunakan `padam` untuk Mengagihkan Memori?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-26 13:50:02367semak imbas

 Placement New: Why Can't We Use `delete` to Deallocate Memory?

Pengurusan Memori yang Betul untuk Peletakan Baharu

Apabila menggunakan peletakan baharu, menjadi tanggungjawab pengaturcara untuk memanggil pemusnah secara manual dan membebaskan memori yang diperuntukkan . Ini berbeza daripada kelakuan lalai pengendali padam, yang biasanya mengendalikan kedua-dua tugas.

Mengapa Tidak Padam?

Dalam kod yang disediakan:

char* pMemory = new char[sizeof(MyClass)];
MyClass* pMyClass = new(pMemory) MyClass();

Memori diperuntukkan secara manual menggunakan new[] untuk tatasusunan aksara saiz sepadan dengan objek MyClass. Peletakan baharu kemudiannya digunakan untuk membina objek dalam memori ini.

Menggunakan padam di sini adalah salah kerana operator baru[] digunakan untuk memperuntukkan memori secara manual. delete bertujuan untuk memori yang diperuntukkan menggunakan operator baharu, yang tidak berlaku di sini.

Tanggungjawab Pemusnah

Memandangkan peletakan baharu telah digunakan, adalah menjadi tanggungjawab pengaturcara untuk memanggil pemusnah untuk melepaskan objek. Walau bagaimanapun, ini tidak membebaskan memori yang diperuntukkan secara automatik. Untuk mengelakkan kebocoran memori, memori harus dibebaskan secara eksplisit selepas pemusnah dipanggil.

Peletakan Baharu dengan Penampan Dalaman

Peletakan baharu juga boleh digunakan dengan penimbal dalaman yang tidak diperuntukkan dengan operator baru. Dalam kes sedemikian, pemadaman pengendali tidak boleh dipanggil kerana ia boleh mengakibatkan kelakuan yang tidak dijangka atau kerosakan memori.

Contohnya:

struct buffer_struct {
    std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> buffer;
};

MyClass* pMyClass = new (&a.buffer) MyClass(); //created inside buffer_struct a

Dalam kes ini, buffer_struct menyediakan storan untuk Objek MyClass, tetapi pembinaan dan pemusnahan objek dikendalikan secara bebas menggunakan peletakan baharu dan pemusnah, masing-masing.

Atas ialah kandungan terperinci Peletakan Baharu: Mengapa Kami Tidak Boleh Menggunakan `padam` untuk Mengagihkan Memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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