Adakah Vektor::Padam Memusnahkan Objek dalam Vektor Penunjuk?
Apabila berurusan dengan vektor yang mengandungi penunjuk objek, memadamkan elemen menggunakan vektor ::erase() menimbulkan kebimbangan tentang nasib objek yang ditunjuk. Walaupun vector::erase() mengalih keluar elemen daripada vektor, ia tidak memusnahkan objek sebenar secara automatik.
Gelagat Vektor::Padam
Vektor:: erase() mengalih keluar elemen daripada vektor tetapi tidak mengambil hak milik untuk memusnahkan objek. Walau bagaimanapun, jika objek yang terkandung ialah penunjuk mentah, vector::erase() tidak memanggil pemusnahnya sebelum dialih keluar.
Mengendalikan Penunjuk Mentah
Untuk memastikan sumber yang betul pengurusan, anda mesti memadam secara eksplisit setiap penunjuk yang terkandung untuk memadamkan objek yang mereka tunjuk. Ini boleh dicapai menggunakan gelung:
<code class="cpp">void clearVectorContents(std::vector<YourClass *> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; } a.clear(); }
Mengelakkan Penunjuk Mentah
Menyimpan penunjuk mentah dalam bekas standard biasanya tidak digalakkan. Untuk objek yang diperuntukkan secara dinamik, pertimbangkan untuk menggunakan penunjuk pintar seperti boost::shared_ptr untuk mengendalikan pengurusan memori.
Penyelesaian Generik dan Elegan
Penyelesaian yang lebih elegan menggunakan templat dan for_each algoritma:
<code class="cpp">// Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } };</code>
Fungsi ini boleh digunakan dengan for_each untuk memadamkan penunjuk dalam vektor:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>());</code>
Contoh Penggunaan
Pertimbangkan vektor penunjuk kepada objek myclass. Kod berikut memperuntukkan, mencetak dan memadamkan objek:
<code class="cpp">#include <iostream> #include <vector> #include <algorithm> #include <functional> class myclass { public: int i; myclass(): i(10) {} }; // Functor for deleting pointers in vector template<class T> class DeleteVector { public: void operator()(T x) const { delete x; } }; int main() { // Vector of myclass pointers std::vector<myclass *> myclassVector; // Add objects to the vector for (int i = 0; i < 10; i++) { myclassVector.push_back(new myclass); } // Print object values for (int i = 0; i < myclassVector.size(); i++) { std::cout << " " << (myclassVector[i])->i; } // Delete objects using functor and for_each for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass *>()); // Clear the vector myclassVector.clear(); // Print the empty vector size std::cout << "\n" << myclassVector.size(); return 0; }</code>
Atas ialah kandungan terperinci Adakah `vector::erase()` Memusnahkan Objek dalam Vektor Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!