مبدأ RAII
اربط الموارد بدورة حياة الكائن
مبدأ RAII درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما الذي يعنيه RAII
يشير RAII إلى Resource Acquisition Is Initialization. يُكتسب المورد في المنشئ ويُحرَّر في المدمر، وبذلك يرتبط عمره بعمر الكائن.
الفكرة الأساسية
غلّف كل مورد — الذاكرة والملفات والأقفال والمقابس — داخل كائن. وعندما يخرج الكائن من النطاق، يحرّر مدمره المورد تلقائيًا.
#include <iostream>
class Resource {
public:
Resource() { std::cout << "acquire\n"; }
~Resource() { std::cout << "release\n"; }
};
int main() {
Resource r; // acquired
} // released automaticallyلماذا يُعد RAII قويًا؟
يُضمن التنظيف حتى إذا عادت الدالة مبكرًا أو أُلقي استثناء. ولا يمكنك نسيان تحرير مورد غلّفته داخل كائن.
غلاف RAII صغير
إليك مالكًا من النوع int يحرّر ذاكرته على الكومة داخل المدمر — من دون استدعاء يدوي لـ delete في مواضع الاستدعاء.
#include <iostream>
class IntBox {
int* p;
public:
IntBox(int v) : p(new int(v)) {}
~IntBox() { delete p; }
int get() const { return *p; }
};
int main() {
IntBox b(42);
std::cout << b.get() << "\n";
}التنظيف عند العودة المبكرة
بما أن المدمر يعمل عند الخروج من النطاق، فإن return المبكر يؤدي أيضًا إلى تشغيل التنظيف.
#include <iostream>
class Guard {
public:
~Guard() { std::cout << "cleaned\n"; }
};
void work(bool stop) {
Guard g;
if (stop) return; // g still cleaned
std::cout << "more work\n";
}
int main() { work(true); }التنظيف عند الاستثناءات
إذا أدى استثناء إلى فك المكدس، يُدمَّر كل كائن RAII اكتمل إنشاؤه على طول المسار. ولا تبقى الموارد عالقة مطلقًا.
أنواع RAII القياسية
تمتلئ المكتبة القياسية بأنواع RAII: إذ ينظّف كل من std::unique_ptr وstd::lock_guard وstd::fstream وstd::vector موارده في مدمره.
#include <vector>
#include <memory>
int main() {
std::vector<int> v{1, 2, 3}; // frees its buffer
auto p = std::make_unique<int>(9); // frees its int
}لا حاجة إلى شيفرة تنظيف يدوية
مع RAII، تتوقف عن كتابة delete أو fclose أو unlock يدويًا. فاستدعاءات المدمر التي يُدرجها المصرّف تتولى ذلك نيابةً عنك.
مالك واحد لكل مورد
ينبغي أن يكون لكل مورد مالك واحد من نوع RAII، مسؤول عن تحريره. وتتطلب مشاركة الملكية بأمان أنواعًا خاصة مثل std::shared_ptr.
يتكوّن RAII من طبقات
يمكن لكائن RAII أن يحتوي على كائنات RAII أخرى. ويتتابع التدمير تلقائيًا، فتُنظَّف الموارد المعقدة بطريقة صحيحة.
#include <memory>
#include <vector>
struct Session {
std::vector<int> data; // RAII
std::unique_ptr<int> token; // RAII
}; // both members freed automaticallyRAII مقابل الإدارة اليدوية
الإدارة اليدوية عرضة للأخطاء، أما RAII فيجعل التنظيف الصحيح هو السلوك الافتراضي. فضّل أغلفة RAII على أزواج الاكتساب والتحرير الخام في جميع الحالات.
اختبار سريع
اختبر مدى فهمك لـ RAII.
مراجعة
تعلّمت مبدأ RAII: اكتساب المورد في المنشئ وتحريره في المدمر. وهذا يضمن التنظيف عند الخروج العادي، والعودة المبكرة، والاستثناءات. تستخدم المكتبة القياسية RAII في كل مكان، وينبغي لشيفرتك أن تفعل الشيء نفسه.
الأسئلة الشائعة
هل درس «مبدأ RAII» مجاني؟
نعم — نص درس «مبدأ RAII» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «مبدأ RAII»؟
اربط الموارد بدورة حياة الكائن تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «مبدأ RAII»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.