Adakah `Vector::erase()` Memusnahkan Penunjuk Objek Secara Automatik?

Patricia Arquette
Lepaskan: 2024-11-03 00:21:29
asal
602 orang telah melayarinya

 Does `Vector::erase()` Automatically Destroy Object Pointers?

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*> &amp; a ) {
    for ( int i = 0; i < a.size(); i++ ) {
        delete a[i];
    }

    a.clear();
}
Salin selepas log masuk

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;
    }
};
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan