Bagaimana untuk Mengelakkan Kebocoran Memori dengan Vektor Penunjuk dalam C ?

Barbara Streisand
Lepaskan: 2024-11-19 16:31:03
asal
969 orang telah melayarinya

How to Avoid Memory Leaks with Vectors of Pointers in C  ?

Mengelakkan Kebocoran Memori dengan Vektor Penunjuk dalam C

Apabila bekerja dengan peruntukan memori dinamik, adalah penting untuk mengelakkan kebocoran memori. Satu senario biasa melibatkan penggunaan vektor penunjuk kepada objek yang diperoleh daripada kelas asas.

Vektor Penunjuk dan Pengurusan Memori

std::vector menguruskan memori untuk penunjuk, tetapi bukan objek diri mereka sendiri. Ini bermakna objek yang diperuntukkan melalui kaedah push_back() vektor tidak akan dipadamkan secara automatik apabila vektor keluar dari skop.

Mengelakkan Kebocoran Memori

1. Pemadaman Objek Manual:

Pendekatan ini memerlukan pemadaman secara manual setiap objek sebelum vektor terkeluar dari skop, seperti yang ditunjukkan dalam kod di bawah:

#include <vector>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<base*> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(new derived());

    // Manual object deletion
    for (auto& obj : c)
        delete obj;
}
Salin selepas log masuk

2. Penunjuk Pintar:

Alternatifnya ialah menggunakan penunjuk pintar, yang menyediakan pengurusan memori automatik. std::unique_ptr dan std::shared_ptr ialah petunjuk pintar yang biasa digunakan:

std::unique_ptr:

Unik_ptr mewakili pemilikan tunggal sumber. Ia secara automatik memadamkan objek apabila ia keluar dari skop.

#include <vector>
#include <memory>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<std::unique_ptr<base>> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(std::make_unique<derived>());
}
Salin selepas log masuk

std::shared_ptr:

Ptr_kongsi membenarkan berbilang pemilik berkongsi sumber. Ia menjejaki bilangan pemilik dan memadamkan objek apabila kiraan rujukan mencecah sifar.

#include <vector>
#include <memory>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef std::vector<std::shared_ptr<base>> container;

void foo() {
    container c;

    for (unsigned i = 0; i < 100; ++i)
        c.push_back(std::make_shared<derived>());
}
Salin selepas log masuk

3. Boost::ptr_container:

Boost::ptr_container::ptr_vector ialah bekas khusus yang direka untuk menyimpan penunjuk dan memadamnya secara automatik apabila dimusnahkan:

#include <boost/ptr_container/ptr_vector.hpp>

struct base {
    virtual ~base() {}
};

struct derived : base {};

typedef boost::ptr_vector<base> container;

void foo() {
    container c;

    for (int i = 0; i < 100; ++i)
        c.push_back(new Derived());
}
Salin selepas log masuk

Ingat, ia biasanya disyorkan untuk menggunakan penunjuk pintar (terutamanya std::unique_ptr) kerana ia menyediakan pengurusan memori yang selamat dan automatik. Elakkan pemadaman objek manual dan pastikan sumber sentiasa diagihkan apabila tidak lagi diperlukan untuk mengelakkan kebocoran memori dan tingkah laku yang tidak dapat diramalkan dalam kod anda.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebocoran Memori dengan Vektor Penunjuk dalam C ?. 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