Pelajaran modul (1/2)
std::unique_ptr dan std::shared_ptr
Dalam C++ klasik, manajemen memori manual menggunakan operator new dan delete merupakan sumber umum bug seperti kebocoran memori (sumber daya tidak pernah dirilis) atau penunjuk yang menggantung (penunjuk yang menunjuk ke memori yang tidak dialokasikan).
C++ modern memperkenalkan Smart Pointer, yang didefinisikan dalam header <memory>. Mereka secara otomatis mengelola siklus hidup memori yang dialokasikan heap menggunakan RAII (Resource Acquisition Is Initialization), membatalkan alokasi sumber daya ketika penunjuk cerdas keluar dari cakupan.
std::unique_ptr
std::unique_ptr menerapkan konsep kepemilikan eksklusif atas suatu sumber daya. Tidak dapat disalin, hanya dipindahkan (melalui std::move).
#include <memory>
// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2std::shared_ptr
std::shared_ptr menerapkan konsep kepemilikan bersama. Beberapa penunjuk cerdas dapat menunjuk ke sumber daya yang sama. Kelas secara internal mempertahankan jumlah referensi: memori dibebaskan hanya ketika shared_ptr terakhir yang aktif dimusnahkan atau disetel ulang.
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count
std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)Cobalah sendiri
Deklarasikan std::unique_ptr<int> bernama ptr, inisialisasi dengan std::make_unique yang memegang nilai 42. Cetak nilai dereferensi ptr menggunakan std::cout.
Tunjukkan petunjuk
Gunakan `std::unique_ptr<int> ptr = std::make_unique<int>(42);` lalu kirim `*ptr` ke aliran keluaran.
Solusi tersedia setelah 3 upaya
Buat instance std::shared_ptr<int> bernama ptr1 dengan nilai 100 menggunakan std::make_shared. Buat salinan bernama ptr2, dan cetak nilai yang dikembalikan oleh ptr1.use_count() menggunakan std::cout.
Tunjukkan petunjuk
Penyalinan dilakukan melalui penetapan standar: `ptr2 = ptr1;`. Mencetak `ptr1.use_count()` akan menampilkan 2.
Solusi tersedia setelah 3 upaya