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.
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.
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; }
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>()); }
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>()); }
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()); }
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!