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