Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah `vector::erase()` Memusnahkan Objek dalam Vektor Penunjuk?

Adakah `vector::erase()` Memusnahkan Objek dalam Vektor Penunjuk?

Linda Hamilton
Linda Hamiltonasal
2024-10-30 02:07:28985semak imbas

 Does `vector::erase()` Destroy Objects in a Vector of Pointers?

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!

Kenyataan:
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