Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Memadam Penunjuk daripada Vektor dalam C Memusnahkan Objek yang Dirujuk?

Adakah Memadam Penunjuk daripada Vektor dalam C Memusnahkan Objek yang Dirujuk?

Susan Sarandon
Susan Sarandonasal
2024-10-30 19:58:03477semak imbas

  Does Erasing Pointers from a Vector in C   Destroy the Referenced Objects?

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!

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