Adakah Vector::erase() Memusnahkan Penunjuk Objek?
Apabila bekerja dengan vektor penunjuk objek, adalah penting untuk memahami tingkah laku of vector::erase() pada objek yang disimpan. Artikel ini meneroka isu dan menyediakan penyelesaian untuk mengekalkan integriti objek.
Vektor::erase() mengalih keluar elemen daripada vektor dengan memanggil pemusnahnya. Jika objek yang terkandung ialah penunjuk mentah, vector::erase() tidak mengambil alih pemilikan untuk memusnahkan objek yang dirujuk.
Untuk memusnahkan objek yang dirujuk secara eksplisit dalam vektor penunjuk, anda mesti memanggil padam secara manual pada setiap mengandungi penunjuk. Sebagai contoh, coretan kod berikut menunjukkan cara mengosongkan kandungan vektor penunjuk:
<code class="cpp">void clearVectorContents( std::vector <YourClass*> & a ) { for ( int i = 0; i < a.size(); i++ ) { delete a[i]; } a.clear(); }
Walau bagaimanapun, menyimpan penunjuk mentah dalam bekas standard adalah tidak digalakkan. Penyelesaian yang lebih mantap ialah menggunakan penunjuk yang dikongsi (cth., boost::shared_ptr) untuk memastikan pemusnahan objek yang betul.
Penyelesaian Elegan Menggunakan Fungsi dan Templat
Generik dan alternatif yang elegan ialah menggunakan functors dan templat untuk memadamkan penunjuk dalam vektor. Berikut ialah contoh menyeluruh:
<code class="cpp">class DeleteVector { public: bool operator()(T x) const { // Delete pointer. delete x; return true; } };
Fungsi ini boleh digunakan bersama dengan std::for_each() untuk melelaran melalui vektor dan memadamkan penunjuk yang terkandung. Sebagai contoh, kod berikut menunjukkan cara menggunakan fungsi DeleteVector untuk memadam kandungan vektor penunjuk kelas saya:
<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(), DeleteVector<myclass*>());</code>
Dengan menggunakan pendekatan ini, anda boleh memadamkan objek yang dirujuk dalam vektor dengan lancar tanpa perlu risau tentang pengurusan kitaran hayat objek atau kemungkinan kebocoran memori.
Atas ialah kandungan terperinci Adakah `Vector::erase()` Memusnahkan Penunjuk Objek Secara Automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!