Smart Pointer di C++
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 15 dari 104.
Smart pointers adalah class pembungkus yang mengelola memori heap secara otomatis untukmu. Smart pointers menghilangkan kebutuhan untuk memanggil delete secara manual dengan membersihkan memori saat pointer keluar dari cakupan.
Sertakan header <memory> untuk menggunakan smart pointer.
unique_ptr - kepemilikan eksklusif. Hanya satu pointer yang dapat memiliki resource pada satu waktu.
#include <memory>
std::unique_ptr<Player> player = std::make_unique<Player>("Hero");
player->attack(); // Gunakan seperti pointer biasa
// Tidak bisa disalin, tetapi kepemilikannya bisa dipindahkan
std::unique_ptr<Player> player2 = std::move(player);
// player sekarang bernilai nullptrshared_ptr - kepemilikan bersama. Beberapa pointer dapat memiliki resource yang sama. Memori dibebaskan saat pemilik terakhir dihancurkan.
std::shared_ptr<Player> p1 = std::make_shared<Player>("Hero");
std::shared_ptr<Player> p2 = p1; // Keduanya memiliki sumber daya tersebut
std::cout << p1.use_count(); // Menampilkan 2weak_ptr adalah pengamat yang tidak memiliki shared_ptr. Berguna untuk memutus referensi siklik.
std::shared_ptr<Player> shared = std::make_shared<Player>("Hero");
std::weak_ptr<Player> weak = shared;
if (auto locked = weak.lock()) { // Ubah menjadi shared_ptr
locked->attack();
}Gunakan unique_ptr secara default untuk kepemilikan tunggal. Gunakan shared_ptr saat beberapa object perlu berbagi resource. Gunakan weak_ptr untuk mengamati tanpa memperpanjang masa hidup.
Utamakan make_unique dan make_shared daripada new mentah.
Tantangan
MudahMari kita buat sistem berbagi dokumen yang menunjukkan berbagai model kepemilikan smart pointer. Kamu akan melihat bagaimana unique_ptr menerapkan kepemilikan eksklusif, bagaimana shared_ptr memungkinkan beberapa pemilik, dan bagaimana weak_ptr dapat mengamati tanpa memengaruhi masa hidup objek.
Kamu akan membuat dua file untuk mengatur kodemu:
Document.h: Definisikan classDocumentyang merepresentasikan dokumen yang dapat dibagikan. Class ini harus memiliki:- Atribut
titleprivate (string) - Konstruktor yang menerima title dan mencetak
"Document created: <title>" - Destructor yang mencetak
"Document deleted: <title>" - Method
getTitle()yang mengembalikan title
- Atribut
main.cpp: Tunjukkan ketiga tipe smart pointer dengan membaca title dokumen dari input, lalu:- Buat
unique_ptrke sebuah Document dengan title dari input - Cetak
"Unique owner: <title>" - Pindahkan kepemilikan ke
unique_ptrlain menggunakanstd::move - Cetak
"Ownership transferred" - Buat
shared_ptrke Document baru dengan title"SharedDoc" - Buat
shared_ptrkedua yang menunjuk ke dokumen yang sama - Cetak
"Shared owners: <count>"menggunakanuse_count() - Buat
weak_ptrdari salah satu shared pointer - Gunakan
lock()untuk mengakses dokumen melalui weak pointer dan cetak"Weak access: <title>"
- Buat
Ingat untuk menyertakan <memory> untuk smart pointer. Gunakan std::make_unique dan std::make_shared untuk membuat smart pointer-mu. Pesan destructor akan membantumu melihat kapan setiap dokumen dibersihkan secara otomatis di akhir program.
Sertakan file header-mu di main.cpp menggunakan #include "Document.h".
Coba sendiri
#include <iostream>
#include <memory>
#include <string>
#include "Document.h"
using namespace std;
int main() {
string inputTitle;
cin >> inputTitle;
// TODO: Buat unique_ptr ke Document dengan inputTitle
// menggunakan std::make_unique
// TODO: Cetak "Unique owner: <title>"
// TODO: Pindahkan kepemilikan ke unique_ptr lain menggunakan std::move
// TODO: Cetak "Ownership transferred"
// TODO: Buat shared_ptr ke Document baru dengan judul "SharedDoc"
// menggunakan std::make_shared
// TODO: Buat shared_ptr kedua yang menunjuk ke dokumen yang sama
// TODO: Cetak "Shared owners: <count>" menggunakan use_count()
// TODO: Buat weak_ptr dari salah satu shared_ptr
// TODO: Gunakan lock() untuk mengakses dokumen melalui weak_ptr
// dan cetak "Weak access: <title>"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online