الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 1 من 215/18 في الدورة~12 min
دروس الوحدة (1/2)

std::unique_ptr وstd::shared_ptr

في لغة C++ الكلاسيكية، تعد إدارة الذاكرة اليدوية باستخدام عوامل التشغيل new وdelete مصدرًا شائعًا للأخطاء مثل تسرب الذاكرة (لم يتم تحرير الموارد مطلقًا) أو المؤشرات المتدلية (مؤشرات تشير إلى الذاكرة غير المخصصة).

تقدم لغة C++ الحديثة المؤشرات الذكية، المحددة في الرأس <memory>. يقومون تلقائيًا بإدارة دورة حياة الذاكرة المخصصة للكومة باستخدام RAII (تهيئة الحصول على الموارد)، وإلغاء تخصيص المورد عندما يخرج المؤشر الذكي عن النطاق.

محمي_INLINE_3

std::unique_ptr يطبق مفهوم الملكية الحصرية للمورد. لا يمكن نسخه، بل نقله فقط (عبر std::move).

C++
#include <memory>

// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2

محمي_INLINE_6

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

C++
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count

std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)

جربه بنفسك

تمرين#cpp.m7.l1.e1
المحاولات: 0جارٍ التحميل…

قم بتعريف std::unique_ptr<int> المسمى ptr، وقم بتهيئته باستخدام std::make_unique مع الاحتفاظ بالقيمة 42. قم بطباعة القيمة التي تم إلغاء الإشارة إليها لـ ptr باستخدام std::cout.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `std::unique_ptr<int> ptr = std::make_unique<int>(42);` ثم أرسل `*ptr` إلى دفق الإخراج.

الحل متاح بعد 3 من المحاولات

تمرين#cpp.m7.l1.e2
المحاولات: 0جارٍ التحميل…

قم بإنشاء مثيل std::shared_ptr<int> المسمى ptr1 بالقيمة 100 باستخدام std::make_shared. أنشئ نسخة باسم ptr2، ثم اطبع القيمة التي تم إرجاعها بواسطة ptr1.use_count() باستخدام std::cout.

جارٍ تحميل المحرر…
إظهار التلميح

يتم النسخ عبر التعيين القياسي: `ptr2 = ptr1;`. يجب أن تظهر الطباعة `ptr1.use_count()` 2.

الحل متاح بعد 3 من المحاولات