Berbagi teknologi

【C】Penunjuk cerdas

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Petunjuk cerdas menjelaskan

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.

 

Masalah diselesaikan dengan petunjuk cerdas

(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.

 

Beberapa jenis pointer cerdas

Pustaka standar C++ menyediakan beberapa tipe smart pointer, antara lain:

  1. std::unique_ptr

    • model kepemilikan eksklusif, maksudnya aunique_ptrSebuah instance memiliki kepemilikan eksklusif atas objek yang ditunjuknya.
    • Kapanunique_ptrKetika objek tersebut berada di luar cakupan atau disetel ulang secara eksplisit, objek tersebut secara otomatis memanggil destruktor dan melepaskan objek yang dikelola.
    • Menyalin tidak didukung, tetapi pemindahan dapat dilakukan.
  2. std::shared_ptr

    • Model kepemilikan bersama, memungkinkan banyak orangshared_ptrInstance berbagi kepemilikan atas objek yang sama.
    • Gunakan penghitungan referensi untuk melacak referensi ke objek yang samashared_ptrkuantitas.
    • kapan yang terakhirshared_ptrKetika sebuah instance keluar dari cakupan atau direset, jumlah referensi dikurangi menjadi nol, destruktor objek dipanggil, dan objek dilepaskan.
  3. std::weak_ptr

    • digunakan untuk memecahkanshared_ptrmasalah referensi melingkar.
    • Tanpa menambah jumlah referensi, hal itu dapat diamati denganshared_ptrobjek yang dikelola, tetapi tidak berpartisipasi dalam pengelolaan siklus hidupnya.
    • Ketika tidak adashared_ptrKetika sebuah instance menunjuk ke suatu objek,weak_ptrDapat 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.

 

Contoh penunjuk cerdas

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_ptrContoh

std::unique_ptradalah penunjuk cerdas dengan kepemilikan eksklusif, yang memastikan hanya ada satustd::unique_ptr Sebuah instance memiliki kendali atas sumber daya tertentu.Kapanstd::unique_ptrKetika keluar dari cakupan atau direset, sumber daya yang dimilikinya akan dilepaskan secara otomatis.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个unique_ptr来管理MyClass的实例
  10. std::unique_ptr<MyClass> uptr(new MyClass());
  11. // 调用doSomething方法
  12. uptr->doSomething();
  13. // unique_ptr会在离开作用域时自动调用MyClass的析构函数
  14. return 0;
  15. }

std::shared_ptrContoh

std::shared_ptradalah penunjuk cerdas kepemilikan bersama yang memungkinkan banyak halstd::shared_ptrInstance berbagi kepemilikan atas sumber daya yang sama.std::shared_ptrGunakan jumlah referensi untuk melacak berapa banyak penunjuk cerdas yang menunjuk ke sumber daya yang sama. Ketika jumlah referensi mencapai 0, sumber daya tersebut dilepaskan.

  1. #include <memory>
  2. class MyClass {
  3. public:
  4. MyClass() { std::cout << "MyClass constructor called.n"; }
  5. ~MyClass() { std::cout << "MyClass destructor called.n"; }
  6. void doSomething() { std::cout << "Doing something...n"; }
  7. };
  8. int main() {
  9. // 创建一个shared_ptr来管理MyClass的实例
  10. std::shared_ptr<MyClass> sptr(new MyClass());
  11. // 创建第二个shared_ptr,共享同一个MyClass实例
  12. std::shared_ptr<MyClass> sptr2 = sptr;
  13. // 调用doSomething方法
  14. sptr->doSomething();
  15. // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
  16. return 0;
  17. }

 

Tindakan pencegahan

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_ptruntuk memutus siklus tersebut,std::weak_ptrTidak menambah jumlah referensi, hanya menampungstd::shared_ptrKelola 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.

 

Contoh lainnya

https://www.cnblogs.com/dewa-kematian/p/17962676

https://zhuanlan.zhihu.com/p/678722914