دروس الوحدة (1/2)
std::unique_ptr وstd::shared_ptr
في لغة C++ الكلاسيكية، تعد إدارة الذاكرة اليدوية باستخدام عوامل التشغيل new وdelete مصدرًا شائعًا للأخطاء مثل تسرب الذاكرة (لم يتم تحرير الموارد مطلقًا) أو المؤشرات المتدلية (مؤشرات تشير إلى الذاكرة غير المخصصة).
تقدم لغة C++ الحديثة المؤشرات الذكية، المحددة في الرأس <memory>. يقومون تلقائيًا بإدارة دورة حياة الذاكرة المخصصة للكومة باستخدام RAII (تهيئة الحصول على الموارد)، وإلغاء تخصيص المورد عندما يخرج المؤشر الذكي عن النطاق.
محمي_INLINE_3
std::unique_ptr يطبق مفهوم الملكية الحصرية للمورد. لا يمكن نسخه، بل نقله فقط (عبر std::move).
#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 النشط أو إعادة تعيينه.
#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)جربه بنفسك
قم بتعريف std::unique_ptr<int> المسمى ptr، وقم بتهيئته باستخدام std::make_unique مع الاحتفاظ بالقيمة 42. قم بطباعة القيمة التي تم إلغاء الإشارة إليها لـ ptr باستخدام std::cout.
إظهار التلميح
استخدم `std::unique_ptr<int> ptr = std::make_unique<int>(42);` ثم أرسل `*ptr` إلى دفق الإخراج.
الحل متاح بعد 3 من المحاولات
قم بإنشاء مثيل std::shared_ptr<int> المسمى ptr1 بالقيمة 100 باستخدام std::make_shared. أنشئ نسخة باسم ptr2، ثم اطبع القيمة التي تم إرجاعها بواسطة ptr1.use_count() باستخدام std::cout.
إظهار التلميح
يتم النسخ عبر التعيين القياسي: `ptr2 = ptr1;`. يجب أن تظهر الطباعة `ptr1.use_count()` 2.
الحل متاح بعد 3 من المحاولات