حُرّاس النطاق
شغّل التنظيف عند مغادرة النطاق
حُرّاس النطاق درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما حارس النطاق؟
حارس النطاق هو كائن من نوع RAII تتمثل مهمته الوحيدة في تنفيذ إجراء تنظيف عند خروجه من النطاق — حتى عند العودة المبكرة أو حدوث استثناء.
المشكلة التي يحلها
من السهل نسيان التنظيف بعد return مبكر أو throw. يجعل حارس النطاق هذا الإجراء تلقائيًا.
lock_guard: حارس نطاق قياسي
يقفل std::lock_guard كائن mutex عند إنشائه، ويفتح قفله عند إتلافه — فهو حارس نطاق مضمّن للأقفال.
#include <mutex>
std::mutex m;
void critical() {
std::lock_guard<std::mutex> lk(m); // locked
// ... work ...
} // unlocked automaticallyحارس مكتوب يدويًا
يمكنك كتابة حارس يحتفظ بدالة ويستدعيها في المُخرّب.
#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";
}يُنفَّذ التنظيف عند العودة المبكرة
بما أن المُخرّب يُستدعى عند الخروج من النطاق، فإن إجراء الحارس يُنفَّذ مهما كانت الطريقة التي تغادر بها الدالة.
#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); }يُنفَّذ التنظيف عند حدوث استثناء
إذا أدّى استثناء إلى فك النطاق، فسيُستدعى مُخرّب الحارس رغم ذلك، ويحرّر المورد بأمان.
إلغاء حارس
قد ترغب أحيانًا في تخطي التنظيف (عند نجاح العملية). توفّر الحُرّاس الحقيقيون الدالة dismiss() لتعطيل الإجراء.
#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
}استخدمه للتراجع
تتألق حُرّاس النطاق في الشيفرة المعاملاتية: سجّل إجراءً للتراجع، ونفّذ العمل، ثم عطّل الحارس عند النجاح.
الحُرّاس قابلة للنقل فقط
ينبغي ألا يُنسخ الحارس — إذ سيؤدي النسخ إلى تنفيذ الإجراء مرتين. اجعل الحُرّاس قابلة للنقل فقط أو غير قابلة للنسخ.
المساعدات القياسية ومساعدات المكتبات
يحرس std::scoped_lock عدة mutexes، وتوفّر مكتبات مثل GSL الدالة finally. وتضمّن كثير من قواعد الشيفرة أداة صغيرة باسم ScopeGuard.
فضّل أنواع RAII المتخصصة
عندما يتوفر نوع RAII مخصص (lock_guard أو unique_ptr أو fstream)، ففضّله. استخدم حارس نطاق عامًا فقط للتنظيف المخصص الذي لا يملك غلافًا طبيعيًا.
تحقق سريع
اختبر فهمك لحُرّاس النطاق.
مراجعة
تعلّمت أن حارس النطاق ينفّذ التنظيف تلقائيًا عند الخروج من النطاق عبر RAII. ويتعامل مع العودة المبكرة والاستثناءات، ويدعم التراجع باستخدام dismiss()، وينبغي أن يكون قابلًا للنقل فقط. فضّل أنواع RAII المتخصصة عند توفرها.
الأسئلة الشائعة
هل درس «حُرّاس النطاق» مجاني؟
نعم — نص درس «حُرّاس النطاق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «حُرّاس النطاق»؟
شغّل التنظيف عند مغادرة النطاق تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «حُرّاس النطاق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مبدأ RAII
- المُدمّرات والتنظيف
- قاعدة الثلاثة/الخمسة
- حُرّاس النطاق