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

Susan Sarandon
Lepaskan: 2024-10-30 19:58:03
asal
442 orang telah melayarinya

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

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

Penggunaan:

<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());</code>
Salin selepas log masuk

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

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!