0Pricing
C++ Academy · درس

‏shared_ptr وweak_ptr والملكية المشتركة

شارك الملكية باستخدام عدّ المراجع، واكسر الحلقات باستخدام weak_ptr.

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

مشاركة كائن

تحتاج أجزاء متعددة من البرنامج أحيانًا إلى إبقاء كائن حيًا. يتولى std::shared_ptr<T> الملكية المشتركة باستخدام عدّ المراجع.

إنشاء shared_ptr

استخدموا std::make_shared، إذ يخصص كتلة التحكم والكائن في تخصيص واحد.

#include <memory>
auto s = std::make_shared<Widget>(42);
std::cout << s.use_count();   // 1

النسخ يشارك الملكية

يزيد نسخ shared_ptr عدّاد المراجع. ويُنقصه التدمير أو إعادة الإسناد. وعندما يصل العدّاد إلى 0، يُحذف الكائن.

auto a = std::make_shared<Widget>();
auto b = a;                  // ref count is now 2
std::cout << a.use_count();  // 2

كيف يعمل من وراء الكواليس؟

يحتفظ shared_ptr بمؤشرين: أحدهما للكائن والآخر لكتلة تحكم تحتوي على عدّاد أو عدادات المراجع. وتُخصص كتلة التحكم على الكومة.

عدّاد مراجع ذري

يستخدم عدّاد المراجع عمليات ذرية، بحيث يمكن نسخ مؤشرات shared_ptr بأمان عبر الخيوط. لكن الكائن الذي تشير إليه ليس آمنًا تلقائيًا في بيئة الخيوط.

إعادة الضبط وإعادة الإسناد

يُنقص إسناد قيمة جديدة عدّاد المراجع القديم، ويزيد عدّاد المراجع الجديد. وتضبط reset() قيمة shared_ptr على حالة فارغة.

إنشاء shared_ptr من مؤشر خام (تجنّب ذلك)

لا تُنشئ كائنَي shared_ptr من المؤشر الخام نفسه، لأن لكلٍّ منهما كتلة تحكم خاصة به. استخدم make_shared دائمًا.

// BUG
Widget* raw = new Widget();
std::shared_ptr<Widget> a(raw);
std::shared_ptr<Widget> b(raw);   // disaster: two control blocks

مشكلة الدورة

يشكّل كائنان من shared_ptr يشير كلٌّ منهما إلى الآخر دورةً؛ فلا يصل عدّاد المراجع لأيٍّ منهما إلى الصفر، ولا يُحرَّر أيٌّ منهما. وهذا يسبب تسرّبًا للذاكرة.

struct Node {
    std::shared_ptr<Node> next;
};
auto a = std::make_shared<Node>();
auto b = std::make_shared<Node>();
a->next = b;
b->next = a;     // cycle — never freed

كسر الدورات باستخدام weak_ptr

يراقب std::weak_ptr<T> كائن shared_ptr من دون المشاركة في عدّاد المراجع. استخدم أحد طرفَي العلاقة بوصفه weak لكسر الدورة.

struct Node {
    std::shared_ptr<Node> next;
    std::weak_ptr<Node>  prev;     // weak — does not own
};

استخدام weak_ptr

لا يمكنك إلغاء إشارة weak_ptr مباشرةً. استدعِ lock() للحصول على shared_ptr، أو كائن فارغ إذا كان الكائن قد أُتلف.

std::weak_ptr<Widget> w = sharedPtr;
if (auto p = w.lock()) {
    p->use();   // safe — we have a shared_ptr now
} else {
    std::cout << "object expired";
}

التكلفة مقارنةً بـ unique_ptr

يستهلك shared_ptr مساحة أكبر (مؤشران بالإضافة إلى كتلة التحكم) ويكون أبطأ (بسبب عدّاد المراجع الذري). استخدمه فقط عندما تكون الملكية المشتركة مطلوبة فعلًا.

تحقّق سريعًا

ما حالة الاستخدام المعتادة لـ std::weak_ptr؟

مراجعة

يتتبّع shared_ptr الملكية باستخدام عدّاد مراجع ذري. استخدم make_shared، وانتبه إلى الدورات، واكسرها باستخدام weak_ptr. وفّضّل unique_ptr عندما لا تكون المشاركة مطلوبة.

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

هل درس «‏shared_ptr وweak_ptr والملكية المشتركة» مجاني؟

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

ماذا ستتعلم في «‏shared_ptr وweak_ptr والملكية المشتركة»؟

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

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

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

كم من الوقت يستغرق درس «‏shared_ptr وweak_ptr والملكية المشتركة»؟

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

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

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

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

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