Peletakan baharu menyediakan cara untuk memperuntukkan memori untuk objek pada lokasi memori tertentu. Walaupun penggunaannya dengan tatasusunan kelihatan mudah, mencapai kemudahalihan boleh mendatangkan cabaran.
Masalahnya
Pertimbangkan contoh berikut:
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
Di sini, pBuffer mengandungi penimbal untuk tatasusunan yang diperuntukkan oleh []. Walau bagaimanapun, new(pBuffer) A[NUMELEMENTS] mungkin tidak mengembalikan alamat yang sama seperti pBuffer, yang berpotensi membawa kepada kerosakan ingatan.
Menangani Isu
Satu pendekatan adalah untuk letakkan setiap elemen tatasusunan secara manual secara individu menggunakan peletakan baharu:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
Ini memastikan setiap elemen adalah diperuntukkan di lokasi yang betul dalam penimbal.
Mengendalikan Pemusnah
Apabila memadamkan tatasusunan, adalah penting untuk memanggil pemusnah secara manual untuk setiap elemen sebelum memadamkan penimbal:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
Pendekatan ini menjamin pembersihan objek dan ingatan yang betul deallocation.
Kesimpulan
Peletakan baharu untuk tatasusunan menimbulkan cabaran kemudahalihan disebabkan kemungkinan salah jajaran antara alamat yang diperuntukkan dan dikembalikan. Dengan meletakkan setiap elemen tatasusunan secara manual dan mengendalikan pemusnah, pembangun boleh mengatasi cabaran ini dan memanfaatkan peletakan baharu dengan selamat dalam kod mudah alih.
Atas ialah kandungan terperinci Bagaimanakah Peletakan Baharu Boleh Digunakan Dengan Selamat untuk Tatasusunan dalam Kod Mudah Alih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!