Peletakan Baharu untuk Tatasusunan: Kebimbangan Mudah Alih
Dalam C , peletakan baharu membenarkan peruntukan memori pada alamat yang ditentukan. Walau bagaimanapun, penggunaannya untuk tatasusunan memperkenalkan cabaran mudah alih. Artikel ini meneroka isu ini dan membentangkan penyelesaian mudah alih.
Selalunya diandaikan bahawa penunjuk yang dikembalikan oleh[] baharu bertepatan dengan alamat yang diberikan. Walau bagaimanapun, piawaian C (5.3.4, nota 12) menunjukkan bahawa ini mungkin tidak berlaku. Ini menimbulkan masalah apabila cuba memperuntukkan penimbal untuk tatasusunan menggunakan peletakan baharu.
Kod berikut menunjukkan isu ini:
#include <new> #include <stdio.h> class A { public: A() : data(0) {} virtual ~A() {} int data; }; int main() { const int NUMELEMENTS = 20; char* pBuffer = new char[NUMELEMENTS * sizeof(A)]; A* pA = new(pBuffer) A[NUMELEMENTS]; printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); delete[] pBuffer; // Assertion failure due to heap corruption return 0; }
Pemeriksaan memori mendedahkan bahawa sesetengah penyusun (cth., Visual Studio) memperuntukkan bait tambahan sebelum tatasusunan untuk simpan kira dalaman (cth., kiraan elemen tatasusunan). Ini boleh membawa kepada rasuah timbunan.
Timbul persoalan: bolehkah kita menentukan overhed yang dikaitkan dengan peletakan baharu untuk tatasusunan untuk penyusun yang berbeza? Matlamatnya ialah untuk mencari penyelesaian mudah alih.
Penyelesaian Cadangan
Daripada menggunakan peletakan baharu pada keseluruhan tatasusunan, penyelesaian yang mungkin adalah dengan memperuntukkan setiap elemen tatasusunan secara individu:
int main(int argc, char* argv[]) { const int NUMELEMENTS = 20; char* pBuffer = new char[NUMELEMENTS * sizeof(A)]; A* pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new(pA + i) A(); } printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); // Manual destruction for (int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer; return 0; }
Kaedah ini secara eksplisit mengawal penempatan setiap objek dalam tatasusunan dan memastikan pemusnahan dilakukan dengan betul.
Kesimpulan
Menggunakan peletakan baharu untuk tatasusunan memerlukan pertimbangan yang teliti terhadap overhed khusus pengkompil. Penyelesaian yang dicadangkan menawarkan alternatif mudah alih dengan memperuntukkan dan memusnahkan elemen tatasusunan secara individu.
Atas ialah kandungan terperinci Adakah Peletakan Baharu untuk Tatasusunan Benar-benar Mudah Alih dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!