informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Smart Pointer adalah alat dalam C++ yang digunakan untuk mengelola memori yang dialokasikan secara dinamis secara otomatis.
Ini adalah kelas yang merangkum fungsi pointer mentah dan dapat secara otomatis menangani alokasi dan pelepasan sumber daya, sehingga membantu pemrogram menghindari kesalahan manajemen memori yang umum, seperti kebocoran memori, pointer yang menggantung, dan masalah lainnya.
Smart pointer bekerja melalui mekanisme Resource Acquisition Is Initialization (RAII), yang berarti bahwa smart pointer memperoleh sumber daya saat dibuat dan melepaskan sumber daya saat dimusnahkan. Hal ini memastikan bahwa sumber daya dilepaskan dengan benar bahkan dalam keadaan tidak normal.
(1) Kebocoran memori: Memori dilepaskan secara manual, namun dapat dilepaskan secara otomatis menggunakan smart pointer.
(2) Penyebaran dan pelepasan petunjuk kepemilikan bersama, seperti masalah penghancuran ketika beberapa thread menggunakan objek yang sama.
Pustaka standar C++ menyediakan beberapa tipe smart pointer, antara lain:
std::unique_ptr
:
unique_ptr
Sebuah instance memiliki kepemilikan eksklusif atas objek yang ditunjuknya.unique_ptr
Ketika objek tersebut berada di luar cakupan atau disetel ulang secara eksplisit, objek tersebut secara otomatis memanggil destruktor dan melepaskan objek yang dikelola.std::shared_ptr
:
shared_ptr
Instance berbagi kepemilikan atas objek yang sama.shared_ptr
kuantitas.shared_ptr
Ketika sebuah instance keluar dari cakupan atau direset, jumlah referensi dikurangi menjadi nol, destruktor objek dipanggil, dan objek dilepaskan.std::weak_ptr
:
shared_ptr
masalah referensi melingkar.shared_ptr
objek yang dikelola, tetapi tidak berpartisipasi dalam pengelolaan siklus hidupnya.shared_ptr
Ketika sebuah instance menunjuk ke suatu objek,weak_ptr
Dapat mendeteksi bahwa benda tersebut telah hancur.Desain dan penggunaan smart pointer sangat menyederhanakan manajemen memori di C++ dan meningkatkan ketahanan dan keamanan program. Dalam pemrograman C++ modern, sangat disarankan untuk menggunakan smart pointer daripada raw pointer untuk meningkatkan kualitas dan pemeliharaan kode.
Smart pointer digunakan dalam C++ sebagai sarana untuk secara otomatis mengelola memori yang dialokasikan secara dinamis untuk mencegah kebocoran memori dan masalah terkait manajemen sumber daya lainnya.
std::unique_ptr
Contohstd::unique_ptr
adalah penunjuk cerdas dengan kepemilikan eksklusif, yang memastikan hanya ada satustd::unique_ptr
Sebuah instance memiliki kendali atas sumber daya tertentu.Kapanstd::unique_ptr
Ketika keluar dari cakupan atau direset, sumber daya yang dimilikinya akan dilepaskan secara otomatis.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Contohstd::shared_ptr
adalah penunjuk cerdas kepemilikan bersama yang memungkinkan banyak halstd::shared_ptr
Instance berbagi kepemilikan atas sumber daya yang sama.std::shared_ptr
Gunakan jumlah referensi untuk melacak berapa banyak penunjuk cerdas yang menunjuk ke sumber daya yang sama. Ketika jumlah referensi mencapai 0, sumber daya tersebut dilepaskan.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
Digunakanstd::shared_ptr
Saat melakukan hal ini, berhati-hatilah untuk menghindari situasi referensi melingkar, yang akan menyebabkan jumlah referensi tidak pernah turun hingga 0, sehingga menyebabkan kebocoran sumber daya.Dalam hal referensi melingkar, Anda dapat menggunakanstd::weak_ptr
untuk memutus siklus tersebut,std::weak_ptr
Tidak menambah jumlah referensi, hanya menampungstd::shared_ptr
Kelola referensi yang lemah ke sumber daya.
Contoh-contoh ini menunjukkan cara menggunakan penunjuk cerdas untuk mengelola memori yang dialokasikan secara dinamis guna memastikan bahwa sumber daya dilepaskan dengan benar pada waktu yang tepat, menghindari kesalahan umum yang dapat terjadi saat mengelola memori secara manual.
https://www.cnblogs.com/dewa-kematian/p/17962676
https://zhuanlan.zhihu.com/p/678722914