0Pricing
C++ Academy · درس

المحذوفات المخصّصة ودوال الإنشاء

استخدم std::make_unique وstd::make_shared والمحذوفات المخصّصة للموارد غير المتعلقة بالذاكرة.

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

لماذا نستخدم أدوات حذف مخصّصة؟

لا تُحرَّر كل الموارد باستخدام delete. فمقابض الملفات والمقابس وموارد نظام التشغيل الخاصة والمصفوفات تحتاج كلٌّ منها إلى دالة تنظيف مختلفة.

أداة الحذف الافتراضية لـ unique_ptr

يستخدم unique_ptr<T> افتراضيًا delete. أما للمصفوفات، فاستخدم unique_ptr<T[]> الذي يستدعي delete[].

تحديد أداة حذف مخصّصة

مرّر كائنًا قابلًا للاستدعاء بوصفه الوسيط الثاني للقالب. وتتلقى أداة الحذف المؤشر الخام وتحرّره بالطريقة المناسبة.

auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(
    std::fopen("data.txt", "r"), closer);

أداة الحذف لـ shared_ptr

يخزّن shared_ptr أداة الحذف الخاصة به في كتلة التحكم؛ ويُمحى نوعها، لذلك لا يتغيّر نوع shared_ptr نفسه.

std::shared_ptr<FILE> file(
    std::fopen("data.txt", "r"),
    [](FILE* f) { if (f) std::fclose(f); }
);

حالات الاستخدام الشائعة لأدوات الحذف المخصّصة

أمثلة من العالم الحقيقي:

  • مقابض مكتبات C (FILE* و sqlite3* ومقابض curl)
  • موارد نظام التشغيل (HANDLE على Windows و fd على Unix)
  • مسابح ذاكرة مخصّصة
  • كائنات خارجية ذات عدّاد مراجع

std::make_unique (C++14)

الطريقة الموصى بها لإنشاء unique_ptr. تمرّر الوسائط إلى المُنشئ وتتجنّب استخدام new الخام.

auto p = std::make_unique<Widget>(arg1, arg2);

لماذا نستخدم make_unique؟

ثلاث فوائد:

  • أمان الاستثناءات — لا يوجد new خام في شيفرة المستخدم
  • لا حاجة إلى كتابة النوع مرتين
  • لا يمكن تمرير المؤشر الخام عن طريق الخطأ إلى كائنَي unique_ptr

std::make_shared

بالنسبة إلى shared_ptr، يخصّص make_shared كتلة التحكم والكائن في تخصيص واحد من الذاكرة المكدّسة — وهذا أسرع من التخصيصات المنفصلة.

auto p = std::make_shared<Widget>(arg1, arg2);

متى تكون لـ make_shared عيوب؟

يعني التخصيص الواحد أن ذاكرة الكائن لا تُحرَّر إلا بعد زوال جميع كائنات weak_ptr أيضًا. فإذا بقيت كائنات weak_ptr بعد زوال كائنات shared_ptr، ففضّل الإنشاء على خطوتين.

دمج أدوات الحذف المخصّصة مع make

لا تقبل make_unique وmake_shared أداة حذف مخصّصة مباشرةً. أنشئ المؤشر الذكي يدويًا في هذه الحالة.

// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
    std::fopen("data.txt", "r"),
    [](FILE* f) { if (f) std::fclose(f); }
);

مطب: نوع Lambda بوصفه وسيطًا للقالب

لكل lambda نوع فريد. وبالنسبة إلى unique_ptr، استخدم decltype(my_deleter) عند التصريح؛ أو استخدم دالة مسمّاة أو مؤشرًا إلى دالة لتبسيط الأنواع.

تحقّق سريعًا

ما دالة المصنع التي تتيح تخصيص كائن std::shared_ptr وكتلة التحكم الخاصة به في تخصيص واحد من الذاكرة المكدّسة؟

مراجعة

استخدم make_unique وmake_shared في الحالات الاعتيادية. وقدّم أداة حذف مخصّصة (lambda أو دالة) عندما يحتاج المورد إلى ما يتجاوز delete — مثل مقابض الملفات أو كائنات نظام التشغيل أو تنظيف مكتبات C.

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

هل درس «المحذوفات المخصّصة ودوال الإنشاء» مجاني؟

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

ماذا ستتعلم في «المحذوفات المخصّصة ودوال الإنشاء»؟

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

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

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

كم من الوقت يستغرق درس «المحذوفات المخصّصة ودوال الإنشاء»؟

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

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

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

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

  1. لماذا تستبدل المؤشرات الذكية new وdelete الخامّتين
  2. ‏unique_ptr والملكية الحصرية
  3. ‏shared_ptr وweak_ptr والملكية المشتركة
  4. المحذوفات المخصّصة ودوال الإنشاء
← العودة إلى C++ Academy