0Pricing
C++ Academy · Pelajaran

Guard Scope

Jalankan pembersihan saat keluar dari scope

Guard Scope adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.

Apa Itu Penjaga Lingkup

Penjaga lingkup adalah objek RAII yang hanya bertugas menjalankan tindakan pembersihan saat keluar dari lingkup—bahkan ketika fungsi selesai lebih awal atau terjadi pengecualian.

Masalah yang Diselesaikannya

Tanpa penjaga, pembersihan setelah return lebih awal atau throw mudah terlupakan. Penjaga lingkup membuat tindakan tersebut berjalan otomatis.

lock_guard: Penjaga Lingkup Standar

std::lock_guard mengunci mutex saat dibuat dan membukanya saat dihancurkan—penjaga lingkup bawaan untuk penguncian.

#include <mutex>

std::mutex m;

void critical() {
    std::lock_guard<std::mutex> lk(m);   // locked
    // ... work ...
}                                        // unlocked automatically

Penjaga Buatan Sendiri

Anda dapat menulis penjaga yang menyimpan sebuah fungsi dan memanggilnya di dalam destruktor.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    ~ScopeGuard() { fn(); }
};

int main() {
    ScopeGuard g([] { std::cout << "cleanup\n"; });
    std::cout << "work\n";
}

Pembersihan Berjalan Saat Keluar Lebih Awal

Karena destruktor dijalankan saat keluar dari lingkup, tindakan penjaga berjalan terlepas dari cara fungsi tersebut selesai.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    ~ScopeGuard() { fn(); }
};

void run(bool stop) {
    ScopeGuard g([] { std::cout << "always cleaned\n"; });
    if (stop) return;
}

int main() { run(true); }

Pembersihan Berjalan Saat Terjadi Pengecualian

Jika pengecualian mengurai lingkup, destruktor penjaga tetap berjalan dan melepaskan sumber daya dengan aman.

Membatalkan Penjaga

Terkadang Anda ingin melewati pembersihan karena operasi berhasil. Penjaga yang sesungguhnya menyediakan dismiss() untuk menonaktifkan tindakan tersebut.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
    bool active = true;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    void dismiss() { active = false; }
    ~ScopeGuard() { if (active) fn(); }
};

int main() {
    ScopeGuard g([] { std::cout << "rollback\n"; });
    g.dismiss();   // success: no rollback
}

Gunakan untuk Pemulihan

Penjaga lingkup sangat berguna untuk kode transaksional: daftarkan tindakan pemulihan, lakukan pekerjaan, lalu batalkan penjaga setelah berhasil.

Penjaga Hanya Dapat Dipindahkan

Penjaga tidak boleh disalin—penyalinan akan menjalankan tindakan tersebut dua kali. Jadikan penjaga hanya dapat dipindahkan atau tidak dapat disalin.

Pembantu Standar dan Pustaka

std::scoped_lock menjaga beberapa mutex, dan pustaka seperti GSL menyediakan finally. Banyak basis kode menyediakan utilitas kecil ScopeGuard.

Utamakan Jenis RAII Spesifik

Jika tersedia jenis RAII khusus seperti lock_guard, unique_ptr, atau fstream, utamakan jenis tersebut. Gunakan penjaga lingkup umum hanya untuk pembersihan ad hoc yang tidak memiliki pembungkus alami.

Pemeriksaan Cepat

Uji pemahaman Anda tentang penjaga lingkup.

Ringkasan

Anda telah mempelajari bahwa penjaga lingkup menjalankan pembersihan secara otomatis saat keluar dari lingkup melalui RAII. Penjaga ini menangani penyelesaian lebih awal dan pengecualian, mendukung pemulihan dengan dismiss(), serta sebaiknya hanya dapat dipindahkan. Utamakan jenis RAII khusus jika tersedia.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Guard Scope” gratis?

Ya — teks lengkap “Guard Scope” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Guard Scope”?

Jalankan pembersihan saat keluar dari scope Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C++ Academy?

Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Guard Scope” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?

Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Prinsip RAII
  2. Destruktor dan Pembersihan
  3. Aturan Tiga/Lima
  4. Guard Scope
← Kembali ke C++ Academy