C++ Academy · درس

المُدمّرات والتنظيف

حرّر الموارد تلقائيًا

الدرس 2 من 413 خطوة

المُدمّرات والتنظيف درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما الذي يفعله المدمر

يعمل المدمر عند انتهاء عمر الكائن. وتتمثل مهمته في تحرير كل ما يملكه الكائن. ويُسمّى ~ClassName.

#include <iostream>

class File {
public:
    ~File() { std::cout << "closing file\n"; }
};

int main() {
    File f;
}   // ~File runs here

تحرير الذاكرة المملوكة

إذا كان الصنف يملك ذاكرة على الكومة، فيجب أن يحرّرها مدمره. وهذا هو الموضع التقليدي لاستدعاء delete.

#include <iostream>

class Buffer {
    int* data;
public:
    Buffer(int n) : data(new int[n]) {}
    ~Buffer() { delete[] data; }   // cleanup
};

int main() { Buffer b(10); }

تعمل المدمرات تلقائيًا

لا تستدعِ المدمرات بنفسك للكائنات الموجودة على المكدس — فالمصرّف يُدرج الاستدعاء عند نهاية النطاق.

الترتيب العكسي للأعضاء

تُدمَّر كائنات الأعضاء بترتيب عكسي لترتيب التصريح عنها، وذلك بعد تشغيل جسم المدمر.

#include <iostream>

struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
    A a;
    B b;          // destroyed before a
    ~C() { std::cout << "~C\n"; }
};

int main() { C c; }

المدمرات الافتراضية

إذا حذفت كائنًا مشتقًا من خلال مؤشر إلى الصنف الأساسي، فيجب أن يكون مدمر الصنف الأساسي virtual — وإلا تسرّب الجزء المشتق.

#include <iostream>

struct Base {
    virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
    ~Derived() override { std::cout << "~Derived\n"; }
};

int main() {
    Base* p = new Derived();
    delete p;   // both run thanks to virtual
}

يجب ألا ترمي المدمرات استثناءات

يؤدي رمي استثناء من مدمر أثناء فك المكدس إلى إنهاء البرنامج. ينبغي وسم المدمرات ضمنيًا بـ noexcept وألا تسمح أبدًا بخروج الاستثناءات منها.

المدمر الافتراضي

إذا لم تكتب مدمرًا، ينشئ المصرّف مدمرًا يدمّر كل عضو. وبالنسبة إلى الأصناف التي لا تحتوي إلا على أعضاء RAII، فهذا هو التصرف الصحيح تمامًا.

#include <string>
#include <vector>

struct Record {
    std::string name;          // self-cleaning
    std::vector<int> values;   // self-cleaning
};   // default destructor is enough

مدمر = default

اكتب ~Class() = default; لطلب المدمر الذي ينشئه المصرّف صراحةً — وهذا مفيد عندما تحتاج إلى مدمر افتراضي من دون منطق مخصص.

#include <iostream>

struct Shape {
    virtual ~Shape() = default;   // virtual + default
};

تحرير الموارد غير المتعلقة بالذاكرة

تغلق المدمرات الملفات، وتحرّر الأقفال، وتفصل المقابس أيضًا — ولا تقتصر مهمتها على تحرير الذاكرة. وكل مورد مكتسب ينتمي إلى هذا الموضع.

الترتيب بين الكائنات

تُدمَّر المتغيرات المحلية المتعددة بترتيب عكسي لترتيب إنشائها، لذا يستطيع المدمر استخدام الكائنات التي أُنشئت قبله بأمان.

دع أعضاء RAII ينجزون المهمة

إذا كان كل عضو من نوع RAII، فلن تحتاج غالبًا إلى مدمر مخصص على الإطلاق. احتفظ بالمدمرات المكتوبة يدويًا للموارد الخام.

اختبار سريع

اختبر مدى فهمك للمدمرات.

مراجعة

تعلّمت أن المدمرات تحرّر الموارد المملوكة تلقائيًا عند نهاية العمر، وتشغّل مدمرات الأعضاء بترتيب عكسي لترتيب التصريح عنها، ويجب ألا ترمي استثناءات، كما يجب أن تكون virtual في الأصناف الأساسية متعددة الأشكال. وغالبًا ما تجعل أعضاء RAII المدمرات المخصصة غير ضرورية.

البدء مجانًا

تعلم C++ مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «المُدمّرات والتنظيف» مجاني؟

نعم — نص درس «المُدمّرات والتنظيف» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «المُدمّرات والتنظيف»؟

حرّر الموارد تلقائيًا تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «المُدمّرات والتنظيف»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مبدأ RAII
  2. المُدمّرات والتنظيف
  3. قاعدة الثلاثة/الخمسة
  4. حُرّاس النطاق
← العودة إلى C++ Academy