Mengagihkan Tatasusunan Objek Secara Dinamik
Apabila bekerja dengan objek yang mengandungi tatasusunan yang diperuntukkan secara dinamik, mencipta keseluruhan tatasusunan objek ini boleh memberikan cabaran . Menggunakan pendekatan mudah seperti:
A* arrayOfAs = new A[5]; for (int i = 0; i < 5; ++i) { arrayOfAs[i] = A(3); }
membawa kepada isu ingatan apabila objek A dimusnahkan dalam gelung memadam tatasusunan myArray dalaman mereka, menjadikan elemen tatasusunan arrayOfAs tidak sah.
Untuk mengelakkan perkara ini isu, memahami "peraturan 4" (atau "peraturan 5" lanjutan dalam C 11) adalah penting untuk kelas yang mengandungi mentah petunjuk:
Jika tidak ditakrifkan, pengkompil menghasilkan versi kaedah ini sendiri, yang mungkin tidak sesuai untuk penunjuk mentah.
Untuk menyelesaikan ralat yang disebutkan di atas, keperluan minimum untuk kelas yang mengandungi penunjuk ke tatasusunan termasuk:
class A { size_t mSize; int* mArray; public: A(size_t s = 0) {mSize=s;mArray = new int[mSize];} ~A() {delete [] mArray;} A(A const& copy) { mSize = copy.mSize; mArray = new int[copy.mSize]; // Handle copying of integers/other members } A& operator=(A other) { std::swap(mArray, other.mArray); std::swap(mSize, other.mSize); return *this; } };
Sebagai alternatif, menggunakan bekas standard seperti std::vector boleh memudahkan proses, kerana mereka mengendalikan pengurusan memori secara automatik:
class A { std::vector<int> mArray; public: A(){} A(size_t s) :mArray(s) {} };
Atas ialah kandungan terperinci Bagaimana Mengelakkan Isu Memori Apabila Memperuntukkan Susunan Objek secara Dinamik dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!