Smart Pointer di C++
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 15 dari 104.
Smart pointers adalah class pembungkus yang secara otomatis mengelola memori heap 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 - pengamat nonpemilik untuk shared_ptr. Berguna untuk memutus referensi melingkar.
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 buat sistem berbagi dokumen yang menunjukkan berbagai model kepemilikan pointer pintar. 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 bisa dibagikan. Class ini harus memiliki:- Atribut
titleprivat (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 pointer pintar 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 pointer bersama - Gunakan
lock()untuk mengakses dokumen melalui pointer lemah, lalu cetak"Weak access: <title>"
- Buat
Ingat untuk menyertakan <memory> agar bisa menggunakan pointer pintar. Gunakan std::make_unique dan std::make_shared untuk membuat pointer pintarmu. Pesan dari 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