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!