Menu
CoddyTech

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 nullptr

shared_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 2

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

challenge icon

Tantangan

Mudah

Mari 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 class Document yang merepresentasikan dokumen yang dapat dibagikan. Class ini harus memiliki:
    • Atribut title private (string)
    • Konstruktor yang menerima title dan mencetak "Document created: <title>"
    • Destructor yang mencetak "Document deleted: <title>"
    • Method getTitle() yang mengembalikan title
  • main.cpp: Tunjukkan ketiga tipe smart pointer dengan membaca title dokumen dari input, lalu:
    • Buat unique_ptr ke sebuah Document dengan title dari input
    • Cetak "Unique owner: <title>"
    • Pindahkan kepemilikan ke unique_ptr lain menggunakan std::move
    • Cetak "Ownership transferred"
    • Buat shared_ptr ke Document baru dengan title "SharedDoc"
    • Buat shared_ptr kedua yang menunjuk ke dokumen yang sama
    • Cetak "Shared owners: <count>" menggunakan use_count()
    • Buat weak_ptr dari salah satu shared pointer
    • Gunakan lock() untuk mengakses dokumen melalui weak pointer dan cetak "Weak access: <title>"

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online