Adakah Memadam Objek daripada Vektor Penunjuk Memusnahkan Objek Sendiri?
Apabila mengendalikan vektor penunjuk ke objek, adalah penting untuk memahami implikasi menggunakan fungsi erase(). Semasa erase() mengalih keluar elemen daripada vektor dan memanggil pemusnahnya, ini tidak memusnahkan objek yang dirujuk secara automatik.
Implikasi untuk Penunjuk Objek dalam Vektor
Dalam konteks penuding objek, erase() hanya menanggalkan penuding daripada vektor tetapi tidak mengambil hak milik untuk memusnahkan objek asas. Untuk memastikan pengurusan sumber yang betul, anda mesti memanggil pemadaman secara eksplisit pada setiap penuding untuk memadamkan objek yang dirujuk.
Pendekatan Cadangan untuk Memadam Penunjuk Dengan Selamat
Untuk memadamkan penunjuk dan penunjuknya dengan selamat objek berkaitan daripada vektor, anda boleh menggunakan pendekatan berikut:
<code class="cpp">void clearVectorContents(std::vector<YourClass*> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; // Delete the object pointed to by each pointer } a.clear(); // Remove pointers from the vector }
Pendekatan Alternatif Menggunakan Penunjuk Dikongsi
Untuk penyelesaian yang lebih elegan dan generik, pertimbangkan untuk menggunakan rangsangan ::shared_ptr. Penunjuk yang dikongsi mengurus pemilikan dan pemadaman sumber secara automatik, menjadikannya lebih selamat dan lebih mudah untuk mengendalikan vektor penunjuk.
Penyelesaian Dipertingkat Menggunakan Templat dan Fungsi
Penyelesaian yang dipertingkat ini menggunakan templat dan berfungsi untuk memudahkan proses pemadaman penuding:
<code class="cpp">template<class T> class DeleteVector { public: // Delete pointer bool operator()(T x) const { delete x; return true; } };</code>
Penggunaan:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());</code>
Contoh Kod
Contoh berikut menunjukkan penggunaan penyelesaian dipertingkatkan:
<code class="cpp">#include <functional> #include <vector> #include <algorithm> #include <iostream> // Your class class myclass { public: int i; myclass(): i(10) {} }; int main() { // Vector of pointers to myclass objects std::vector<myclass*> myclassVector; // Add objects to vector for (int i = 0; i < 10; ++i) myclassVector.push_back(new myclass); // Print initial vector contents for (auto& obj : myclassVector) std::cout << " " << obj->i; // Delete vector contents using enhanced solution for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>()); // Clear vector myclassVector.clear(); // Print vector size after deletion std::cout << "\n" << myclassVector.size(); return 0; }</code>
Dengan menggunakan pendekatan ini, anda boleh mengalih keluar elemen dengan selamat daripada vektor yang mengandungi penunjuk objek sambil memastikan pengurusan sumber yang betul dan pemusnahan objek.
Atas ialah kandungan terperinci Adakah Memadam Penunjuk daripada Vektor dalam C Memusnahkan Objek yang Dirujuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!